1 读取图片
poolimg=imread(":/new/prefix1/0.bmp",CV_RGB2GRAY);//像这样从资源库里读不行,写绝对路径才能读
if(goalimg.empty())
qDebug() << "凉了" << endl;
如果图片没有读取成功。原本的程序不会报错,而是表现为
qDebug() << “poolimg cols rows” <<poolimg.cols<<poolimg.rows<<endl;行和列读取为0
后续会有难以排查的麻烦。
然后在ui搞了一个滑动条用来更改检测模式【各种模式下检测出来的效果完全一样。。。】
ui会自动在头文件里加
private slots:
void on_verticalSlider_valueChanged(int value);
然后就可以写回调函数
void MainWindow::on_verticalSlider_valueChanged(int value)
{
//创建新图像内存
int cols=poolimg.cols-goalimg.cols +1;
int rows=poolimg.rows-goalimg.rows +1;
// resultimg.create(cols,rows,CV_32FC1 );//有一个32位的有符号通道//【CV_8UC3 有3个通道,每个通道是8位的无符号数据】//黑色的400*400左右的窗口
resultimg.create(poolimg.dims,poolimg.size,poolimg.type());//灰色的原图大小的窗口
qDebug() << "poolimg.dims,poolimg.size," <<cols<<rows<<endl;
//imshow("createImg",resultimg);//其实就是个用来装结果的空盒子//显示出来康康
//进行匹配和标准化
matchTemplate( poolimg, goalimg, resultimg,TM_CCOEFF_NORMED );
// normalize( resultimg, resultimg, 0, 1, NORM_MINMAX, -1, Mat() );
// imshow ("resultimg",resultimg);
//保存数据
double minVal; double maxVal; Point minLoc; Point maxLoc;
minMaxLoc( resultimg, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
qDebug() << "resultimg val" <<minVal<<maxVal<<endl;//-0.464084 0.915053
//数值越大匹配越好
Point matchLoc;
matchLoc = maxLoc;
//按照目标图片的大小画个矩形显示出来
Mat img_display;
poolimg.copyTo( img_display );
rectangle( img_display, matchLoc, Point( matchLoc.x + goalimg.cols , matchLoc.y + goalimg.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( resultimg, matchLoc, Point( matchLoc.x + goalimg.cols , matchLoc.y + goalimg.rows ), Scalar::all(0), 2, 8, 0 );
imshow( "final image_window", img_display );
imshow( "final result_window", resultimg );
}
【优快云】opencv模板匹配步骤及Code
【opencv官网】模板匹配
【优快云】OpenCV基于形状的模板匹配
【优快云】图像处理(8) :模板匹配【是halcon的库(是收费商用不公开源代码的机器视觉库)】
【优快云】QT+opencv学习笔记(6)——模板匹配