1单匹配:

测试图片:

OpenCV--模板匹配与滑动窗口(单匹配或多匹配)  OpenCV--模板匹配与滑动窗口(单匹配或多匹配)

code:

  1. #include <opencv\cv.h>
  2. #include <opencv\highgui.h>
  3. #include <opencv\cxcore.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. /*
  7. 模板匹配法 --图片查找
  8. 滑动窗口的原理
  9. 用等大小的模板窗口在范围中进行滑动 然后查找匹配
  10. */
  11. int main(int argc, char* argv[]){
  12. IplImage*src,*templat,*result,*show;
  13. int srcW,templatW,srcH,templatH,resultW,resultH;
  14. //加载源图像
  15. src = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png" , CV_LOAD_IMAGE_GRAYSCALE);
  16. //用于显示结果
  17. show = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png");
  18. //加载模板图像
  19. templat = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png" , CV_LOAD_IMAGE_GRAYSCALE);
  20. if(!src || !templat){
  21. printf("打开图片失败");
  22. return 0;
  23. }
  24. srcW = src->width;
  25. srcH = src->height;
  26. templatW = templat->width;
  27. templatH = templat->height;
  28. if(srcW<templatW || srcH<templatH){
  29. printf("模板不能比原图小");
  30. return 0;
  31. }
  32. //计算结果矩阵的大小
  33. resultW = srcW - templatW + 1;
  34. resultH = srcH - templatH + 1;
  35. //创建存放结果的空间
  36. result = cvCreateImage(cvSize(resultW,resultH),32,1);
  37. double minVal,maxVal;
  38. CvPoint minLoc,maxLoc;
  39. //调用模板匹配函数
  40. cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);
  41. //查找最相似的值及其所在坐标
  42. cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);
  43. printf("minVal %f maxVal %f\n ",minVal,maxVal);
  44. //绘制结果
  45. cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);
  46. //显示结果
  47. cvNamedWindow("show");
  48. cvNamedWindow("tem");
  49. cvShowImage("show",show);
  50. cvShowImage("tem" , templat);
  51. cvWaitKey(0);
  52. return 0;
  53. }


 

2多匹配:

code:

  1. #include <opencv\cv.h>
  2. #include <opencv\highgui.h>
  3. #include <opencv\cxcore.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. /*
  7. 模板匹配法 --图片查找
  8. 滑动窗口的原理
  9. 用等大小的模板窗口在范围中进行滑动 然后查找匹配
  10. */
  11. CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templatHeight,double maxValIn , CvPoint lastLoc){
  12. int y,x;
  13. int startY,startX,endY,endX;
  14. //计算大矩形的左上角坐标
  15. startY = lastLoc.y - templatHeight;
  16. startX = lastLoc.x - templatWidth;
  17. //计算大矩形的右下角的坐标 大矩形的定义 可以看视频的演示
  18. endY = lastLoc.y + templatHeight;
  19. endX = lastLoc.x + templatWidth;
  20. //不允许矩形越界
  21. startY = startY < 0 ? 0 : startY;
  22. startX = startX < 0 ? 0 : startX;
  23. endY = endY > result->height-1 ? result->height-1 : endY;
  24. endX = endX > result->width - 1 ? result->width - 1 : endX;
  25. //将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域 避免找到重叠的目标
  26. for(y=startY;y<endY;y++){
  27. for(x=startX;x<endX;x++){
  28. cvSetReal2D(result,y,x,maxValIn);
  29. }
  30. }
  31. double minVal,maxVal;
  32. CvPoint minLoc,maxLoc;
  33. //查找result中的最小值 及其所在坐标
  34. cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);
  35. return minLoc;
  36. }
  37. int main(int argc, char* argv[]){
  38. IplImage*src,*templat,*result,*show;
  39. int srcW,templatW,srcH,templatH,resultW,resultH;
  40. //加载源图像
  41. src = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png" , CV_LOAD_IMAGE_GRAYSCALE);
  42. //加载用于显示结果的图像
  43. show = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png");
  44. //加载模板图像
  45. templat = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png" , CV_LOAD_IMAGE_GRAYSCALE);
  46. if(!src || !templat){
  47. printf("打开图片失败");
  48. return 0;
  49. }
  50. srcW = src->width;
  51. srcH = src->height;
  52. templatW = templat->width;
  53. templatH = templat->height;
  54. if(srcW<templatW || srcH<templatH){
  55. printf("模板不能比原图小");
  56. return 0;
  57. }
  58. //计算结果矩阵的宽度和高度
  59. resultW = srcW - templatW + 1;
  60. resultH = srcH - templatH + 1;
  61. //创建存放结果的空间
  62. result = cvCreateImage(cvSize(resultW,resultH),32,1);
  63. double minVal,maxVal;
  64. CvPoint minLoc,maxLoc;
  65. //进行模板匹配
  66. cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);
  67. //第一次查找最小值 即找到第一个最像的目标
  68. cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);
  69. //绘制第一个查找结果到图像上
  70. cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);
  71. //查找第二个结果
  72. minLoc = getNextMinLoc( result , templat->width,templat->height, maxVal , minLoc);
  73. //绘制第二个结果
  74. cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);
  75. //显示结果
  76. cvNamedWindow("show");
  77. cvShowImage("show",show);
  78. cvWaitKey(0);
  79. return 0;
  80. }

转载自:
博主:a771948524
博文地址:https://blog.csdn.net/zxlstudio/article/details/10025847
来源:CSDN

相关文章:

  • 2021-07-02
  • 2022-02-21
  • 2022-01-04
  • 2022-12-23
  • 2021-10-09
  • 2021-11-18
  • 2021-09-11
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-03
  • 2021-08-16
  • 2022-01-22
  • 2021-09-27
  • 2021-07-23
相关资源
相似解决方案