目录

  • 修改完BUG后的程序以及效果
  • 优化思路,增强正确识别率(待验证)

修改完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】加载模板图像********************************************************////创建模板vectorvector<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】加载测试图像********************************************************////创建测试vectorvector<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){//将不符合像素数目规则的模板的可能性置1vector<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{//将不符合像素数目规则的模板的可能性置0vector<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:拍摄瓶子其他角度的照片,进行同样的操作,然后将所有角度的照片的相似度相加,选取相似度最大的为最终瓶子序号

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

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

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

  2. 【视觉项目】【day1】8.20号实验记录(初步使用模板匹配)

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

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

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

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

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

  5. 细思极恐的“25号宇宙实验”的心理学启示:过于富足+缺乏边界=沉沦与毁灭?

    1 假设有一个理想的美丽新世界:那里没有贫穷,没有疾病,不存在饥荒,不存在资源不足的世界,一切都是充足的,一切都是美好的.你觉得在这样的世界生活会是一种怎样的体验呢? 一系列科学实验真的揭开了这个问题 ...

  6. “25号宇宙实验”:现代孩子可能身处在即将摧毁世界的乌托邦中

    追求完美是人类骨子里的天性. 人类从古至今都在致力于打造一个,没有贫富差距.没有疾病疫情.资源分配均匀的美丽新世界.但当这样的世界真的来临的时候,或许那会是人类真正的灭绝. 科学家们做过不少关于乌托邦 ...

  7. 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 ...

  8. 【人工智能项目】MNIST手写体识别实验及分析

    [人工智能项目]MNIST数据集实验报告 这是之前接的小作业,现在分享出来,给大家以学习!!! [人工智能项目]MNIST手写体识别实验及分析 1.实验内容简述 1.1 实验环境 本实验采用的软硬件实 ...

  9. 【人工智能项目】Fashion Mnist识别实验

    [人工智能项目]Fashion Mnist识别实验 本次主要通过四个方法对fashion mnist进行识别实验,主要为词袋模型.hog特征.mlp多层感知器和cnn卷积神经网络.那么话不多说,走起来 ...

最新文章

  1. c++ socket error 10038错误
  2. python开发微信小程序-Python 开发者的微信小程序开发实践
  3. 计算机视觉行业迎来大发展,多角度解读未来前景
  4. 爬虫从入门到放弃——爬虫的基本原理
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的健身管理系统
  6. MySQL 5.6 rpm安装方法和碰见的问题
  7. 动态创建表格(各种管理系统常见)
  8. C语言 — 编程规范、标识符命名规范
  9. 拓端tecdat|R语言泰坦尼克号随机森林模型案例数据分析
  10. fluent并行 linux_fluent并行计算命令
  11. 【NDK】Android NDK下载安装教程
  12. css 动态设定div背景颜色
  13. 为什么手机浏览器打不开html文件,手机浏览器打不开网页的解决方法
  14. 全球与中国电子柜锁市场深度研究分析报告
  15. android onupgrade调用,Android Sqlite中常见的对于onUpgrade的处理方法
  16. 你未来的职业规划是什么?
  17. matlab 实验七 低层绘图操作,matlab实验内容答案
  18. (转载)计算机网络中的两军问题
  19. Gate使用手册(四)数据输出
  20. seesion cookie鉴权 与 token鉴权

热门文章

  1. 从字符串 const str = ‘qwbewrbbeqqbbbweebbbbqee‘;中能得到结果 [“b“, “bb“, “bbb“, “bbbb“] 以下错误语句是?
  2. 单片机c语言参考文献最新,[2018年最新整理]10个单片机C语言实例.doc
  3. springboot mysql时区设置_java/springboot/mysql时区问题解决方案
  4. flow 静态类型检查 js
  5. React.js 入门与实战课程思维导图
  6. css的再深入7(更新中···)
  7. vue slot的使用
  8. Maven常用的构建命令
  9. Git push 时每次都需要密码的疑惑
  10. 虚拟机照样飞速跑Windows Server2008