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

【视觉项目day28.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)】古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述视觉项目day28.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)相关的知识,希望能为你提供帮助。


目录

  • ??均衡化代码??
  • ??模板图片按照大小排序??
  • ??总代码??
  • ??测试效果??
  • ??新思路??
由于模板匹配是像素之间的比对,所以不同光照下的像素灰度值也会不同
所以在比对之前,我们需要对测试图和模板图进行直方图均衡化,这一步可以先实现。
今天将采用批量处理的方式,来检测模板匹配的准确度。

这里发现,最好还是先对所有测试图均衡化再截取模板。
因为测试图和模板图分开来均衡化是不合理的。
equalizeHist( src, dst );
该函数只支持单通道的均衡化,对于彩色图像来说可以先将多通道分离成单通道,再合并成多通道。

均衡化代码
for (int i = 0; i < filenames.size(); i++)
srcImg = cv::imread(filenames[i]);
//*************************对图片的处理部分***************************/
//这里我们对原图进行直方图均衡化
vector< Mat> channels; //定义存储的容器
split(srcImg,channels);
Mat bluechannel = channels[0]; //b通道的图像
equalizeHist(bluechannel, bluechannel); //均衡化
Mat greenchannel = channels[1]; //g通道的图像
equalizeHist(greenchannel, greenchannel);
Mat redchannel = channels[2]; //r通道的图像
equalizeHist(redchannel, redchannel);
merge(channels, dstImg); //合并通道
//********************************************************************/
savedfilename = dest + filenames[i].substr(len);
std::cout < < savedfilename < < std::endl;
cv::imwrite(savedfilename, dstImg);
cout < < "第" < < i < < "张完成" < < endl;
waitKey(30);

模板图片按照大小排序

将模板图按照像素大小,从大到小排序。防止出现测试图局部地区误判成像素较少的模板(这是因为发现误判的情况还挺多的)
结果:没有卵用。。。

总代码
#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>
#include < fstream>
#define WINDOW_NAME "【程序窗口】"
using namespace cv;
using namespace std;

//展示推测结果与实际值
void show_text(int nums, String real_name)

if (nums == 0)

cout < < "推测:大棕瓶 "< < ""< < real_name < < endl;

else if (nums == 1)

cout < < "推测:BAL" < < "" < < real_name < < endl;

else if (nums == 2)

cout < < "推测:方底圆肩 " < < "" < < real_name < < endl;

else if (nums == 3)

cout < < "推测:长条 " < < "" < < real_name < < endl;

else if (nums == 4)

cout < < "推测:圆肩" < < "" < < real_name < < endl;

else if(nums == 5)

cout < < "推测:桶肩" < < "" < < real_name < < endl;

else if (nums == 6)

cout < < "推测:多面肩" < < "" < < real_name < < endl;

else if (nums == 7)

cout < < "推测:方方" < < "" < < real_name < < endl;

else if (nums == 8)

cout < < "推测:小长条" < < "" < < real_name < < endl;

else if (nums == 9)

cout < < "推测:小桶肩" < < "" < < real_name < < endl;

else if (nums == 10)

cout < < "推测:小方肩" < < "" < < real_name < < endl;

else if (nums ==11)

cout < < "推测:葡萄形" < < "" < < real_name < < endl;

else if (nums == 12)

cout < < "推测:小小长条" < < "" < < real_name < < endl;

else

cout < < "推测:无" < < "" < < real_name < < endl;


//展示每个模板与测试图最佳匹配的可能性
void show_probability(int nums, double probability)

if (nums == 0)

cout < < "大棕瓶的概率 " < < "" < < probability < < endl;

else if (nums == 1)

cout < < "BAL的概率" < < "" < < probability < <

    推荐阅读