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

134 阅读15分钟

目录

修改完BUG后的程序以及效果

修改代码后的测试结果:(利用连通域面积将明显比本张测试图的瓶子要小的模板提前去除,减少误判)
这样下来,28张测试图,13个样本,四张测试图误判,这比之前效果好很多了。
代码:

#pragma region 匹配主程序
//匹配主程序
//获取瓶子外轮廓的函数
//输入:原图灰度图 canny阈值 输出:轮廓图 mask2图
void get_external_Contours_function(Mat& srcImage, Mat& dstImage,Mat& dstmask, int canny_thred)
{
	//模糊化降噪
	blur(srcImage, srcImage, Size(5, 5));
	Mat mask;
	//大津二值化
	threshold(srcImage, mask, 100, 255, THRESH_OTSU);
	//闭操作
	int Abs_offset = 2;
	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(Abs_offset * 2 + 1, Abs_offset * 2 + 1), Point(Abs_offset, Abs_offset));	//返回的是内核矩阵
	morphologyEx(mask, mask, MORPH_CLOSE, element);
	//孔洞填充
	Point startpoint = Point(40,40);
	My_hole_filling(mask, mask, 0, startpoint);
	//将mask缩小一圈
	Mat mask2;
	Mat element_erode = getStructuringElement(MORPH_ELLIPSE, Size(Abs_offset * 2 + 1, Abs_offset * 2 + 1), Point(Abs_offset, Abs_offset));	//返回的是内核矩阵
	morphologyEx(mask, mask2, MORPH_DILATE, element_erode);
	dstmask = mask2;
	//mask2就是我们的掩膜
	//对二值图进行canny检测
	Canny(srcImage, dstImage, canny_thred, canny_thred * 2, 3);
	//将在mask2内的所有为白的像素置为黑
	int height = dstImage.rows;
	int width = dstImage.cols;
	for (int j = 0; j < height; j++)
	{
		for (int i = 0; i < width; i++)
		{
			if (mask2.at<uchar>(j, i) == 0 && dstImage.at<uchar>(j, i) == 255)
			{
				dstImage.at<uchar>(j, i) = 0;
			}
		}
	}
}
//模板2-14的瓶子面积
int pixels_num_criterion[13] = {18144,15836,15504,18623,14913,13383,14950,13192,12677,11718,12413,8002, 8870 };
int pixels_num_sub = 2000;
//
//将测试图转换成与模板图相匹配的函数
//输入:测试图 canny算子阈值 输出:外轮廓图 
//返回值:该测试图mask2中的瓶子像素个数
int test_covertTo_Outer_contour(Mat& srcImg, Mat& dstImg, int thred)
{
	//这里我们批量处理
	Mat mask2;
	//int thred = 40;
	//转换成灰度
	cvtColor(srcImg, dstImg, COLOR_BGR2GRAY);
	get_external_Contours_function(dstImg, dstImg, mask2, thred);
	//观察连通域个数,同时选出最大的那个连通域,之前对mask2进行反色
	mask2 = 255 - mask2;
	Mat lableMat;
	Mat statsMat;
	Mat centerMat;
	int nComp = cv::connectedComponentsWithStats(mask2,
		lableMat,
		statsMat,
		centerMat,
		8,
		CV_32S);
	//找出连通域像素个数最多的那个,然后记录下像素个数
	int max_pixels = 0;
	int max_pixels_label = 0;
	if (nComp == 1) max_pixels = statsMat.at<int>(1, 4);
	else
	{
		//找到像素点最多的连通域标记
		vector<int > pixels_nums;
		//0是背景
		for (int i = 1; i < nComp; i++)
		{
			pixels_nums.push_back(statsMat.at<int>(i, 4));	//将连通域面积入vector
		}
		//找到最大的值并且返回它在vector的位置,然后还需要+1才是在连通域label中的位置
		auto maxPosition = max_element(pixels_nums.begin(), pixels_nums.end());
		max_pixels = *(maxPosition);
		max_pixels_label = (maxPosition - pixels_nums.begin() + 1);
	}
	return max_pixels;
}
int main()
{
	//改变控制台字体颜色
	system("color 02");
	//******************************************【0】获取测试文件夹路径和模板文件夹路径********************************************************//
	//获取测试文件夹路径和模板文件夹路径
	cv::String path_test = "D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图/";
	cv::String path_template = "D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓/";
	cout << "获取地址成功" << endl;
	//******************************************【1】加载模板图像********************************************************//
	//创建模板vector
	vector<Mat>tempMat;
	//插入模板元素
	Mat srcImage;
	std::vector<cv::String> temp_filenames;
	cv::glob(path_template, temp_filenames);                 //opencv里面用来读取指定路径下文件名的一个很好用的函数
	for (int i = 0; i < temp_filenames.size(); i++)
	{
		srcImage = cv::imread(temp_filenames[i], 0);
		tempMat.push_back(srcImage);
		cout << temp_filenames[i] << endl;
	}
	//获取模板数目
	int tempMat_Nums = tempMat.size();
	//******************************************【2】加载测试图像********************************************************//
	//创建测试vector
	vector<Mat>testMat;
	//插入测试元素
	std::vector<cv::String> test_filenames;
	cv::glob(path_test, test_filenames);                 //opencv里面用来读取指定路径下文件名的一个很好用的函数
	for (int i = 0; i < test_filenames.size(); i++)
	{
		srcImage = cv::imread(test_filenames[i]);
		testMat.push_back(srcImage);
		//cout << test_filenames[i] << endl;
	}
	//获取测试图数目
	int testMat_Nums = testMat.size();
	//******************************************【3】对每张测试图进行模板匹配********************************************************//
	for (int j = 0;j < testMat_Nums;j++)
	{
		cout << "第" << j << "张测试图片的测试" << endl;
		Mat resultMat;
		Mat CompareMat;
		Mat dispMat;
		//将测试图转换成与模板图相匹配的类型
		int test_mask_pxiels = 0;
		test_mask_pxiels = test_covertTo_Outer_contour(testMat[j], CompareMat, 40);
		cout << "test_mask_pxiels" << test_mask_pxiels << endl;
		int match_method = TM_CCORR_NORMED;		//经过试错发现此参数较好。
		//用每个模板去匹配测试图,并且找出每次结果的最佳匹配值,将值存入vector中
		vector<double>goodval;
		vector<Point>goodlock;
		int matchnum = 0;
		Point matchLoc;
		vector<int>prepare_template_num;
		cout << "可能的模板序号" << endl;
		for (int i = 0;i < 13;i++)
		{
			if (test_mask_pxiels <= (pixels_num_criterion[i] + pixels_num_sub))
			{
				//将符合规则的模板序号导入vector中
				//数组0号元素对应2号瓶子,以此类推
				prepare_template_num.push_back(i+2);
				cout << i+2 << " ";
			}
		}
		cout << endl;
		for (int x = 0;x < prepare_template_num.size();x++)
		{
			cout << prepare_template_num[x] << " ";
		}
		cout << endl;
		for (int i = 0;i < tempMat_Nums;i++)
		{
			//采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;
			matchTemplate(CompareMat, 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)
			{
				//将不符合像素数目规则的模板的可能性置1
				vector<int>::iterator result = find(prepare_template_num.begin(), prepare_template_num.end(), i+2); //查找该模板是否食欲符合规则的模板
				if (result == prepare_template_num.end()) //没找到
				{
					minVal = 1;
				}
				goodlock.push_back(minLoc);
				goodval.push_back(minVal);
			}
			else
			{
				//将不符合像素数目规则的模板的可能性置0
				vector<int>::iterator result = find(prepare_template_num.begin(), prepare_template_num.end(), i+2); //查找该模板是否食欲符合规则的模板
				if (result == prepare_template_num.end()) //没找到
				{
					maxVal = 0;
				}
				goodlock.push_back(maxLoc);
				goodval.push_back(maxVal);
			}
			show_probability(i, 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, test_filenames[j]);
		matchLoc = goodlock[matchnum];
		testMat[j].copyTo(dispMat);
		//以最佳匹配点为中心绘制与模板相同大小的框
		rectangle(dispMat, matchLoc, Point(matchLoc.x + tempMat[matchnum].cols, matchLoc.y + tempMat[matchnum].rows), Scalar::all(255), 2, 8, 0);
		namedWindow("testMat", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩
		imshow("testMat", dispMat);
		waitKey(30);
	}
	return 0;
}
#pragma endregion

结果:

获取地址成功
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\2.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\3.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\4.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\5.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\6.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\7.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\8.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\9.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\A.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\B.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\C.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\D.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/template外轮廓\E.jpg
第0张测试图片的测试
test_mask_pxiels14347
可能的模板序号
2 3 4 5 6 7 8 9 10 12
2 3 4 5 6 7 8 9 10 12
推测: 2 0.123901
推测: 3 0.156158
推测: 4 0.150744
推测: 5 0.187313
推测: 6 0.145311
推测: 7 0.195507
推测: 8 0.196251
推测: 9 0.162524
推测: 10 0.216251
推测: 11 0
推测: 12 0.188596
推测: 13 0
推测: 14 0
推测: 10 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\10+波纹.jpg
第1张测试图片的测试
test_mask_pxiels13617
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.146226
推测: 3 0.154282
推测: 4 0.170318
推测: 5 0.135289
推测: 6 0.147944
推测: 7 0.15646
推测: 8 0.236019
推测: 9 0.215505
推测: 10 0.258656
推测: 11 0.170947
推测: 12 0.200819
推测: 13 0
推测: 14 0
推测: 10 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\10+麻点.jpg
第2张测试图片的测试
test_mask_pxiels13368
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.135993
推测: 3 0.165682
推测: 4 0.137155
推测: 5 0.165001
推测: 6 0.140285
推测: 7 0.157791
推测: 8 0.183201
推测: 9 0.168241
推测: 10 0.244568
推测: 11 0.202944
推测: 12 0.19839
推测: 13 0
推测: 14 0
推测: 10 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\10+气泡+瓶口破裂.jpg
第3张测试图片的测试
test_mask_pxiels14335
可能的模板序号
2 3 4 5 6 7 8 9 10 12
2 3 4 5 6 7 8 9 10 12
推测: 2 0.152579
推测: 3 0.173889
推测: 4 0.176829
推测: 5 0.161792
推测: 6 0.157213
推测: 7 0.157324
推测: 8 0.181057
推测: 9 0.168678
推测: 10 0.999826
推测: 11 0
推测: 12 0.194559
推测: 13 0
推测: 14 0
推测: 10 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\10.jpg
第4张测试图片的测试
test_mask_pxiels12677
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.147605
推测: 3 0.144232
推测: 4 0.142059
推测: 5 0.134749
推测: 6 0.121717
推测: 7 0.17694
推测: 8 0.176446
推测: 9 0.165368
推测: 10 0.198408
推测: 11 0.181647
推测: 12 0.211815
推测: 13 0
推测: 14 0
推测: 12 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\10_2.jpg
第5张测试图片的测试
test_mask_pxiels11718
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.14523
推测: 3 0.163475
推测: 4 0.152999
推测: 5 0.141765
推测: 6 0.129466
推测: 7 0.13226
推测: 8 0.176833
推测: 9 0.175101
推测: 10 0.179946
推测: 11 0.999803
推测: 12 0.181169
推测: 13 0
推测: 14 0
推测: 11 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\11.jpg
第6张测试图片的测试
test_mask_pxiels12413
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.116069
推测: 3 0.13952
推测: 4 0.145787
推测: 5 0.15493
推测: 6 0.109966
推测: 7 0.137925
推测: 8 0.189892
推测: 9 0.128961
推测: 10 0.154989
推测: 11 0.156869
推测: 12 0.999794
推测: 13 0
推测: 14 0
推测: 12 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\12.jpg
第7张测试图片的测试
test_mask_pxiels8002
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12 13 14
2 3 4 5 6 7 8 9 10 11 12 13 14
推测: 2 0.106183
推测: 3 0.121711
推测: 4 0.107394
推测: 5 0.111871
推测: 6 0.120286
推测: 7 0.127004
推测: 8 0.106887
推测: 9 0.151444
推测: 10 0.121035
推测: 11 0.125367
推测: 12 0.142005
推测: 13 0.999765
推测: 14 0.139114
推测: 13 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\13+炸口.jpg
第8张测试图片的测试
test_mask_pxiels8870
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12 13 14
2 3 4 5 6 7 8 9 10 11 12 13 14
推测: 2 0.108714
推测: 3 0.129143
推测: 4 0.155743
推测: 5 0.155155
推测: 6 0.119927
推测: 7 0.145495
推测: 8 0.180172
推测: 9 0.179382
推测: 10 0.158717
推测: 11 0.18485
推测: 12 0.198007
推测: 13 0.166223
推测: 14 0.999819
推测: 14 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\14.jpg
第9张测试图片的测试
test_mask_pxiels18144
可能的模板序号
2 5
2 5
推测: 2 0.999781
推测: 3 0
推测: 4 0
推测: 5 0.144677
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 2 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\2+料纹.jpg
第10张测试图片的测试
test_mask_pxiels16658
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.133496
推测: 3 0.999796
推测: 4 0.134315
推测: 5 0.156003
推测: 6 0.147757
推测: 7 0
推测: 8 0.154767
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 3 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\3.jpg
第11张测试图片的测试
test_mask_pxiels15836
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.133188
推测: 3 0.208995
推测: 4 0.138319
推测: 5 0.14704
推测: 6 0.142752
推测: 7 0
推测: 8 0.161025
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 3 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\3_2.jpg
第12张测试图片的测试
test_mask_pxiels17636
可能的模板序号
2 3 5
2 3 5
推测: 2 0.143928
推测: 3 0.134388
推测: 4 0
推测: 5 0.157441
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\4+厚底.jpg
第13张测试图片的测试
test_mask_pxiels16468
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.170317
推测: 3 0.13123
推测: 4 0.283525
推测: 5 0.153677
推测: 6 0.226632
推测: 7 0
推测: 8 0.186912
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 4 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\4+厚底2.jpg
第14张测试图片的测试
test_mask_pxiels15504
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.130616
推测: 3 0.16463
推测: 4 0.177138
推测: 5 0.145669
推测: 6 0.19108
推测: 7 0
推测: 8 0.157038
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\4+炸肩.jpg
第15张测试图片的测试
test_mask_pxiels19443
可能的模板序号
2 5
2 5
推测: 2 0.137516
推测: 3 0
推测: 4 0
推测: 5 0.999832
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\5+脖夹料.jpg
第16张测试图片的测试
test_mask_pxiels18623
可能的模板序号
2 5
2 5
推测: 2 0.139779
推测: 3 0
推测: 4 0
推测: 5 0.17853
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\5+肩薄.jpg
第17张测试图片的测试
test_mask_pxiels19209
可能的模板序号
2 5
2 5
推测: 2 0.139443
推测: 3 0
推测: 4 0
推测: 5 0.187202
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\5+气泡.jpg
第18张测试图片的测试
test_mask_pxiels20063
可能的模板序号
2 5
2 5
推测: 2 0.14445
推测: 3 0
推测: 4 0
推测: 5 0.231063
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\5+炸口.jpg
第19张测试图片的测试
test_mask_pxiels19552
可能的模板序号
2 5
2 5
推测: 2 0.143492
推测: 3 0
推测: 4 0
推测: 5 0.220859
推测: 6 0
推测: 7 0
推测: 8 0
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\5+皱纹气泡.jpg
第20张测试图片的测试
test_mask_pxiels14913
可能的模板序号
2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
推测: 2 0.116033
推测: 3 0.121852
推测: 4 0.233253
推测: 5 0.134713
推测: 6 0.281223
推测: 7 0.138854
推测: 8 0.127367
推测: 9 0.139431
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\6.jpg
第21张测试图片的测试
test_mask_pxiels15616
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.125211
推测: 3 0.138032
推测: 4 0.17826
推测: 5 0.150319
推测: 6 0.999773
推测: 7 0
推测: 8 0.122557
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\6_2.jpg
第22张测试图片的测试
test_mask_pxiels15653
可能的模板序号
2 3 4 5 6 8
2 3 4 5 6 8
推测: 2 0.12
推测: 3 0.144833
推测: 4 0.161208
推测: 5 0.134843
推测: 6 0.287775
推测: 7 0
推测: 8 0.132088
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\6_3.jpg
第23张测试图片的测试
test_mask_pxiels15158
可能的模板序号
2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
推测: 2 0.148487
推测: 3 0.140199
推测: 4 0.178806
推测: 5 0.156645
推测: 6 0.154185
推测: 7 0.999805
推测: 8 0.139173
推测: 9 0.185976
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 7 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\7+厚底.jpg
第24张测试图片的测试
test_mask_pxiels13383
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.128894
推测: 3 0.141077
推测: 4 0.164418
推测: 5 0.164935
推测: 6 0.174865
推测: 7 0.235266
推测: 8 0.133497
推测: 9 0.240758
推测: 10 0.201196
推测: 11 0.208232
推测: 12 0.15844
推测: 13 0
推测: 14 0
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\7+厚底2.jpg
第25张测试图片的测试
test_mask_pxiels14950
可能的模板序号
2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
推测: 2 0.101819
推测: 3 0.129199
推测: 4 0.117485
推测: 5 0.143024
推测: 6 0.119083
推测: 7 0.13419
推测: 8 0.999812
推测: 9 0.16494
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 8 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\8.jpg
第26张测试图片的测试
test_mask_pxiels15271
可能的模板序号
2 3 4 5 6 7 8
2 3 4 5 6 7 8
推测: 2 0.13404
推测: 3 0.116104
推测: 4 0.150828
推测: 5 0.137656
推测: 6 0.155449
推测: 7 0.145615
推测: 8 0.28041
推测: 9 0
推测: 10 0
推测: 11 0
推测: 12 0
推测: 13 0
推测: 14 0
推测: 8 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\8_2.jpg
第27张测试图片的测试
test_mask_pxiels13192
可能的模板序号
2 3 4 5 6 7 8 9 10 11 12
2 3 4 5 6 7 8 9 10 11 12
推测: 2 0.124749
推测: 3 0.16525
推测: 4 0.114765
推测: 5 0.15284
推测: 6 0.124658
推测: 7 0.154759
推测: 8 0.159853
推测: 9 0.999833
推测: 10 0.151396
推测: 11 0.194999
推测: 12 0.15805
推测: 13 0
推测: 14 0
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/测试图\9.jpg

优化思路,增强正确识别率(待验证)

优化思路1:延续之前的限制方法,想出其他的一些特征变量,先排除出显然与本张测试图不符合的模板,再用备选模板去匹配。
我们以及用到的变量:瓶子像素个数
暂时想到的其他可以用的变量:

轮廓(连通域)的面积、周长、矩形度、圆形度、宽长比、周径比等形状描述符
由于暂时的代码没有使用轮廓,只要在canny之后加上find轮廓函数就可以了

优化思路2:拍摄瓶子其他角度的照片,进行同样的操作,然后将所有角度的照片的相似度相加,选取相似度最大的为最终瓶子序号