目录

  • 【day1】8.20号实验记录(初步使用模板匹配)
    • 模板匹配
    • 单张图的代码
    • 利用多个模板去匹配多张图的代码
      • 写代码过程中遇到的问题

【day1】8.20号实验记录(初步使用模板匹配)

模板匹配

利用模板匹配可以框定出瓶子,但是却不能分辨哪种瓶子是哪种瓶子。
对同一张图片用不同的模板去进行匹配,选择匹配度最高的作为最终的结果。
而且这种匹配受到模板大小的限制。若是摄像头固定,视角固定,那这个问题可以解决。

单张图的代码

#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#define WINDOW_NAME "【程序窗口】"
using namespace cv;
using namespace std;
int main()
{//改变控制台字体颜色system("color 02");Mat srcImage=imread("D:\\opencv_picture_test\\视觉项目\\圆1.png");   //测试图Mat tempMat = imread("D:\\opencv_picture_test\\视觉项目\\方template.png");   //模板图//Mat srcImage=imread("D:\\opencv_picture_test\\img.png");  //测试图//Mat tempMat = imread("D:\\opencv_picture_test\\template.png");    //模板图cout << tempMat.cols << endl;cout << tempMat.rows << endl;Mat refMat;Mat resultMat;Mat dispMat;tempMat.copyTo(refMat);int match_method = TM_CCOEFF_NORMED;//采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;matchTemplate(srcImage, refMat, resultMat, match_method);normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());    //归一化double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc;  //定义最大值最小值以及它们的位置变量minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat()); //从结果矩阵中找到匹配度最大以及最小的值并且确定其位置//对于方法SQDIFF和SQDIFF_NORMED两种方法来讲,越小的值就有着更高的匹配结果//而其余的方法则是数值越大匹配效果越好if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)matchLoc = minLoc;elsematchLoc = maxLoc;srcImage.copyTo(dispMat);//circle(dispMat, matchLoc, 5, Scalar(0, 0, 255), 2, 8, 0);//以最佳匹配点为中心绘制与模板相同大小的框rectangle(dispMat, matchLoc, Point(matchLoc.x + refMat.cols, matchLoc.y + refMat.rows), Scalar::all(0), 2, 8, 0);namedWindow("template", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩imshow("template", refMat);namedWindow("srcImage", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩imshow("srcImage", dispMat);waitKey(0);return 0;
}

利用多个模板去匹配多张图的代码

写代码过程中遇到的问题

1、要理解好result矩阵的含义
2、match_method 要多试几种
3、不同模板对同一张测试图匹配后得到的result数组中,不需要对其归一化,不然会发现,每个模板的最佳值都是1(使用TM_CCORR_NORMED时),这样就比较不了了。

#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#define WINDOW_NAME "【程序窗口】"
using namespace cv;
using namespace std;void show_text(int nums)
{if (nums == 0){cout << "方" << endl;}else if (nums == 1){cout << "v圆" << endl;}else if (nums == 2){cout << "圆" << endl;}else if (nums == 3){cout << "小" << endl;}else if (nums == 4){cout << "中" << endl;}else{cout << "无" << endl;}
}
int main()
{//改变控制台字体颜色system("color 02");//创建模板vectorvector<Mat>tempMat;//插入模板元素Mat temp = imread("D:\\opencv_picture_test\\视觉项目\\方template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\视觉项目\\v圆template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\视觉项目\\圆template.png");tempMat.push_back(temp);temp = imread("D:\\opencv_picture_test\\视觉项目\\小template.png");tempMat.push_back(temp);temp= imread("D:\\opencv_picture_test\\视觉项目\\中template.png");tempMat.push_back(temp);Mat tempMat1 = tempMat[0];Mat tempMat2 = tempMat[1];Mat tempMat3 = tempMat[2];Mat tempMat4 = tempMat[3];Mat tempMat5 = tempMat[4];//获取模板数目int tempMat_Nums = tempMat.size();//获取测试图像Mat srcImage=imread("D:\\opencv_picture_test\\视觉项目\\v圆1.png");  //测试图Mat resultMat;Mat dispMat;int match_method = TM_CCORR_NORMED;     //经过试错发现此参数较好。//用每个模板去匹配测试图,并且找出每次结果的最佳匹配值,将值存入vector中vector<double>goodval;vector<Point>goodlock;int matchnum = 0;Point matchLoc;for (int i = 0;i < tempMat_Nums;i++){//采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;matchTemplate(srcImage, tempMat[i], resultMat, match_method);//不归一化,因为不同模板归一化后的最佳值皆为1,无法比较//normalize(resultMat, resultMat, 0, 1, NORM_MINMAX, -1, Mat());   //归一化double minVal; double maxVal; Point minLoc; Point maxLoc;  //定义最大值最小值以及它们的位置变量minMaxLoc(resultMat, &minVal, &maxVal, &minLoc, &maxLoc, Mat()); //从结果矩阵中找到匹配度最大以及最小的值并且确定其位置//对于方法SQDIFF和SQDIFF_NORMED两种方法来讲,越小的值就有着更高的匹配结果//而其余的方法则是数值越大匹配效果越好if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){goodlock.push_back(minLoc);goodval.push_back(minVal);}else{goodlock.push_back(maxLoc);goodval.push_back(maxVal);}cout << i << "  "<<maxVal << endl;}//找到goodval中最佳的一组if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){auto goodPosition = min_element(goodval.begin(), goodval.end());matchnum = distance(begin(goodval), goodPosition);}else{auto goodPosition = max_element(goodval.begin(), goodval.end());matchnum = distance(begin(goodval), goodPosition);}show_text(matchnum);matchLoc = goodlock[matchnum];srcImage.copyTo(dispMat);//circle(dispMat, matchLoc, 5, Scalar(0, 0, 255), 2, 8, 0);//以最佳匹配点为中心绘制与模板相同大小的框rectangle(dispMat, matchLoc, Point(matchLoc.x + tempMat[matchnum].cols, matchLoc.y + tempMat[matchnum].rows), Scalar::all(0), 2, 8, 0);//namedWindow("template", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩//imshow("template", tempMat);namedWindow("srcImage", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩imshow("srcImage", dispMat);waitKey(0);return 0;
}

【视觉项目】【day1】8.20号实验记录(初步使用模板匹配)相关推荐

  1. 【视觉项目】【day3】8.22号实验记录(利用canny检测之后的来进行模板匹配)

    [day3]8.22号实验记录(几乎没干正事的一天,利用canny检测之后的来进行模板匹配) 今天没搞代码,主要是问研究生学长工业摄像头的接法的,学长也不知道,明天问问老师... 晚上搞了一下cann ...

  2. 【视觉项目】【day5】8.25号实验记录(修完BUG,28张测试图,13个样本,四张测试图误判,这比之前效果好很多了)

    目录 修改完BUG后的程序以及效果 优化思路,增强正确识别率(待验证) 修改完BUG后的程序以及效果 修改代码后的测试结果:(利用连通域面积将明显比本张测试图的瓶子要小的模板提前去除,减少误判) 这样 ...

  3. 【视觉项目】【day4】8.24号实验记录(消除瓶子内部“边缘”)

    思路分析以及代码 思路1:使用findContours函数,设置轮廓为最外部RETR_EXTERNAL,结果发现结果仍然是所有轮廓. 思路2:先二值化,然后进行闭操作,然后canny,得到的轮廓确实比 ...

  4. 【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)

    目录 均衡化代码 模板图片按照大小排序 总代码 测试效果 新思路 由于模板匹配是像素之间的比对,所以不同光照下的像素灰度值也会不同 所以在比对之前,我们需要对测试图和模板图进行直方图均衡化,这一步可以 ...

  5. 操作系统真象还原实验记录之实验七:加载内核

    操作系统真象还原实验记录之实验七:加载内核 对应书P207 1.相关基础知识总结 1.1 elf格式 1.1.1 c程序如何转化成elf格式 写好main.c的源程序 //main.c int mai ...

  6. 发现让人惊叹,美国教授花半生研究爱迪生实验记录

    原创:Intelge鹰谷 ​ 图1.托马斯·爱迪生 托马斯·爱迪生(1847-1931),可以说是全世界的发明之王.从1870年开始发明之路,61年时间获得1093个美国专利授权.他不仅发明了留声机和 ...

  7. HIT-大数据分析Lab1:数据预处理-实验记录

    本文是哈工大大数据分析实验1的完整实验记录,包含环境配置,相关知识介绍以及实验解析.希望对后来人有帮助(新手小白没什么头绪,走一步查一步对应的博客o(╥﹏╥)o),博客链接之间会穿插一些我自己的理解, ...

  8. 【深度学习】【U-net】医学图像(血管)分割实验记录

    医学图像分割实验记录 U-net介绍 数据集 实验记录 实验1 实验2(fail) 实验3(fail) 实验4(fail) 实验5(fail) 实验6(fail) 本项目仅用于大创实验,使用pytor ...

  9. CSAPP Lab2 实验记录 ---- Bomb Lab(Phase 1 - Phase 6详细解答 + Secret Phase彩蛋解析)

    文章目录 Lab 总结博客链接 实验前提引子 实验需要指令及准备 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Phase Secret(彩蛋Phas ...

最新文章

  1. [51nod1376] 最长递增子序列的数量
  2. 使用Ant实现打包jar包上传到服务器
  3. RxSwift笔记七其他操作符
  4. 如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...
  5. 目标检测——感受野的学习笔记
  6. postman安装和安装后双击没反应
  7. UESTC 1636 梦后楼台高锁,酒醒帘幕低垂 最小生成树Kruskal算法的扩展
  8. ERP系统无缝对接扫码功能,快速提高企业生产效率
  9. 成都理工大学计算机类中外合办,成都理工大学代码
  10. 感谢爱测未来,零基础的我的实习期是这么过来的
  11. vnc报错 PID file /home/root/.vnc/localhost.pid not readable after start.
  12. Python获取法定节假日
  13. 人民币大小写转换格式
  14. 世界各国和地区名称及首都
  15. 短信验证码总是发送失败是什么原因?
  16. 项链分赃问题与Borsuk-Ulam定理
  17. 跑深度学习CV的代码的常用包安装
  18. Android穿山甲SDK接入信息流广告
  19. Ducky Debugging(字符串输入)题解
  20. Android:应用程序未安装解决方法

热门文章

  1. js检测数组对象中是否有重复值
  2. java的六大_java程序员必备的六大工具!
  3. 帝国CMS后台getshell
  4. html5拖动的面板 panel,基于jQuery UI的Bootstrap Panel面板功能增强插件
  5. web3.js_1.x.x--API(一)event/Constant/deploy/options
  6. 《React源码解析》系列完结!
  7. 【总结】计算机网络常见问题
  8. ESLint共享配置的两种方式eslint-plugin和eslint-config
  9. 基于webpack3.x从0开始搭建React开发环境
  10. Azure IoT Hub和Event Hub相关的技术系列-索引篇