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

目录

  • 修改完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:拍摄瓶子其他角度的照片,进行同样的操作,然后将所有角度的照片的相似度相加,选取相似度最大的为最终瓶子序号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux kernel and user space通信机制,Linux内核空间与用户空间通信机制地研究.doc

实用文案标准文档Linux内核空间与用户空间通信机制的研究Linux kernel space and user space communication mechanism摘 要Linux 是一个源码开放的操作系统&#xff0c;无论是普通用户还是企业用户都可以编写自己的内核代码&#xff0c;再加上对标准内核的裁剪从而制作出适合自…

前台用js、jquery出现错误很多是由于IE缓存

例如&#xff1a;当你用jquery进行异步请求数据时&#xff0c;如果浏览器发现请求的地址不变&#xff0c;或者参数也不改变的情况下 IE默认是取原来的缓存中的数据&#xff0c;而不进行重新请求数 解决的方法是是在地址栏的后面加上一个随机参数值&#xff0c;IE发现地址改变&a…

python 示例_带有示例的Python date timetuple()方法

python 示例Python date.timetuple()方法 (Python date.timetuple() Method) date.timetuple() method is used to manipulate objects of date class of module datetime. date.timetuple()方法用于操作模块datetime的日期类的对象。 It is an instance method which means …

WebC.BBS 项目参与新人必读

开发环境: 采用Visual Studio 2010&#xff0c;MVC版本采用Asp.Net MVC3&#xff0c;数据库采用Sql2005 2008,扩展技术包括jQuery。 SVN的相关信息&#xff1a; SVN-Url&#xff1a;svn://svn.cyqdata.com/project_bbs 账户申请&#xff1a;请将自己的密码发给组长&#xff0c;…

第四章 字典

第四章 字典{键:值,名字:电话号码} 映射&#xff1a;通过名称来访问其各个值的数据结构 列表&#xff1a;将一系列值组合成数据结构并通过编号来访问各个值 字典是Python中唯一的内置映射类型&#xff0c;其中的值不按顺序排列&#xff0c;而是存储在键下 键可能是数、字符串…

利用梯度下降法求解一元线性回归和多元线性回归

文章目录原理以及公式【1】一元线性回归问题【2】多元线性回归问题【3】学习率【4】流程分析&#xff08;一元线性回归&#xff09;【5】流程分析&#xff08;多元线性回归&#xff09;归一化原理以及每种归一化适用的场合一元线性回归代码以及可视化结果多元线性回归代码以及可…

linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

0. 说明本学习系列代码几乎完全摘自&#xff1a;asmtutor.com&#xff0c;如果英文可以的(也可以用谷歌浏览器翻译看)&#xff0c;可以直接看asmtutor.com上的教程系统环境搭建&#xff1a;(我用的是ubuntu18.04.4 server&#xff0c;安装gcc、g)sudo apt install nasmsudo apt…

Javascript之创建对象(原型模式)

我们创建的每个函数都有一个prototype(原型)属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c;它的用途是包含可以有特定类型的所有实例共享的属性和方法。 prototype就是通过构造函数而创建的那个对象的原型对象。使用原型的好处就是可以让所有对象实例…

treeset java_Java TreeSet pollLast()方法与示例

treeset javaTreeSet类pollLast()方法 (TreeSet Class pollLast() method) pollLast() method is available in java.util package. pollLast()方法在java.util包中可用。 pollLast() method is used to return the last highest element and then remove the element from thi…

第五章 条件、循环及其他语句

第五章 条件、循环及其他语句 再谈print和import print现在实际上是一个函数 1&#xff0c;打印多个参数 用逗号分隔&#xff0c;打印多个表达式 sep自定义分隔符&#xff0c;默认空格 end自定义结束字符串&#xff0c;默认换行 print("beyond",yanyu,23)#结果为…

两种方法将Android NDK samples中hello-neon改成C++

一、第一种方法&#xff1a;1.修改helloneon.c 中代码 a.将 char* str; 改为 char str[512] {0}; b.将 asprintf(&str, "FIR Filter benchmark:\nC version : %g ms\n", time_c); 改为 sprintf(str, "FIR Filter benchmark:\nC ve…

【视觉项目】【day6】8.26关于matchTemplate()以及NCC的思考整理

NCC与matchTemplate()函数中match_method TM_CCOEFF_NORMED是否一样&#xff1f; 先看公式&#xff1a; TM_CCOEFF_NORMED NCCTM_CCOEFF_NORMED:归一化的相关性系数匹配方法 NCC:normalized cross correlation:归一化互相关系数 公式是一样的。 参考&#xff1a; 模板匹配的几…

linux待机流程,Linux睡眠喚醒機制--Kernel態

一、對於休眠(suspend)的簡單介紹 在Linux中,休眠主要分三個主要的步驟: 1) 凍結用戶態進程和內核態任務2) 調用注冊的設備的suspend的回調函數, 順序是按照注冊順序3) 休眠核心設備和使CPU進入休眠態, 凍結進程是內核把進程列表中所有的進程的狀態都設置為停止,並且保存下…

strictmath_Java StrictMath log1p()方法与示例

strictmathStrictMath类log1p()方法 (StrictMath Class log1p() method) log1p() method is available in java.lang package. log1p()方法在java.lang包中可用。 log1p() method is used to return (the logarithm of the sum of the given argument and 1 like log(1d) in th…

第六章 抽象

第六章 抽象 自定义函数 要判断某个对象是否可调用&#xff0c;可使用内置函数callable import math x 1 y math.sqrt callable(x)#结果为&#xff1a;False callable(y)#结果为&#xff1a;True使用def&#xff08;表示定义函数&#xff09;语句&#xff0c;来定义函数 …

HTTP 状态代码

如果向您的服务器发出了某项请求要求显示您网站上的某个网页&#xff08;例如&#xff0c;当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时&#xff09;&#xff0c;那么&#xff0c;您的服务器会返回 HTTP 状态代码以响应该请求。 此状态代码提供了有关请求状态的信…

TensorFlow的可训练变量和自动求导机制

文章目录一些概念、函数、用法TensorFlow实现一元线性回归TensorFlow实现多元线性回归一些概念、函数、用法 对象Variable 创建对象Variable&#xff1a; tf.Variable(initial_value,dtype)利用这个方法&#xff0c;默认整数为int32&#xff0c;浮点数为float32&#xff0c;…

linux samba安装失败,用aptitude安装samba失败

版本&#xff1a;You are using Ubuntu 10.04 LTS- the Lucid Lynx - released in April 2010 and supported until April 2013.root下执行aptitude install sambaReading package lists... DoneBuilding dependency treeReading state information... DoneReading extended st…

django第二个项目--使用模板做一个站点访问计数器

上一节讲述了django和第一个项目HelloWorld&#xff0c;这节我们讲述如何使用模板&#xff0c;并做一个简单的站点访问计数器。 1、建立模板 在myblog模块文件夹&#xff08;即包含__init__.py的文件夹)下面新建一个文件夹templates&#xff0c;用于存放HTML模板&#xff0c;在…

strictmath_Java StrictMath log10()方法与示例

strictmathStrictMath类log10()方法 (StrictMath Class log10() method) log10() method is available in java.lang package. log10()方法在java.lang包中可用。 log10() method is used to return the logarithm of the given (base 10) of the given argument in the method…