【视觉项目】基于梯度的NCC模板匹配代码以及效果

文章目录

  • 流程分析
  • 工程代码
    • 【1】NCC代码
      • 【Ⅰ】sttPxGrdnt结构体
      • 【Ⅱ】sttTemplateModel模板结构体
      • 【Ⅲ】calcAccNCC计算ncc系数函数
      • 【Ⅳ】searchNcc NCC模板匹配函数
      • 【Ⅴ】searchSecondNcc 二级搜索:在某一特定点周围再以步进为1搜索
    • 【2】测试图转外轮廓
      • 【Ⅰ】孔洞填充(默认背景为黑)
      • 【Ⅱ】获取瓶子外轮廓
      • 【Ⅲ】测试图转外轮廓
    • 【3】总代码
  • 总结

流程分析

#预处理部分
1、将测试图转为150:100,缩小图片尺寸
2、截取备用模板图
3、加载模板到结构体vector中
4、计算每个temp每个像素点的dx,dy,mag,包括着坐标信息x,y,存入vector vModel中(注意双for循环顺序)
#主要部分
5、加载测试图
6、使用test_covertTo_Outer_contour函数得到测试图的外轮廓
7、用不同的模板与测试图searchNcc,每次结果的最佳匹配值,将值存入vector中,最小外接矩形存入vector中
8、找到匹配值vector中最大的值,确定模板标签,打印结果,在原图上绘制对应模板的最小外接矩形

工程代码

【1】NCC代码

【Ⅰ】sttPxGrdnt结构体

//定义数据结构体,存放某一像素点的位置,及其梯度信息
typedef struct 
{int x;int y;float gx;float gy;float mag;
}sttPxGrdnt;

【Ⅱ】sttTemplateModel模板结构体

由于简化,我们这边不考虑旋转因素,不考虑图像金字塔加速

//定义模板结构体
struct sttTemplateModel
{//int no;//int pyrLevel;			//金字塔层数std::vector <sttPxGrdnt> vModel;//长宽指的是在原模版的基础上//包含了尺度和旋转变换后的的bounding box的尺寸int height;int width;float score;		//存放最大值//float scale;//float angle;//指在原图的基础上//进行尺度变化后的图像的rect,进一步进行旋转后的旋转Rect//cv::RotatedRect rotRect;cv::Rect resRect;	//存放最大值得坐标,外接矩形
};

【Ⅲ】calcAccNCC计算ncc系数函数

//计算ncc系数
//由于分母 (sqrtf(gx1*gx1 + gy1*gy1) * sqrtf(gx2*gx2 + gy2*gy2))
//即mag1 和 mag2,存在重复计算部分,故在建立模型时预先计算,并且把除法转换为乘法
//创建此版本作为加速
float calcAccNCC(float gx1, float gy1, float gx2, float gy2, float magMinus1, float magMinus2)
{return ((gx1 * gx2 + gy1 * gy2) * (magMinus1 * magMinus2));
}

【Ⅳ】searchNcc NCC模板匹配函数

int searchNcc(cv::Mat srcGx,cv::Mat srcGy,cv::Mat srcMag,cv::Mat srcCannyMat,int searchStep,sttTemplateModel& srcModel)
{//检查参数int t_width = srcModel.width;int t_height = srcModel.height;int s_width = srcGx.cols;int s_height = srcGy.rows;int d_width = s_width - t_width;int d_height = s_height - t_height;//如果测试图小于模板图的大小,则退出if (d_width < 0 || d_height < 0) {return 1;}//建立NCC系数矩阵cv::Mat nccMat(d_height, d_width, CV_64FC1);nccMat = 0;int nEdge = srcModel.vModel.size();//以步进为searchStep搜索整个图像for (int i = 0; i < d_height; i = i + searchStep){for (int j = 0; j < d_width; j = j + searchStep){//遍历向量int cnt = 0;int nccSum = 0;	for (int m = 0; m < nEdge; m++) {int dx = srcModel.vModel[m].x;int dy = srcModel.vModel[m].y;int srcx = j + dx;int srcy = i + dy;//只对轮廓点进行计算if (srcCannyMat.at<uchar>(srcy, srcx) == 255) {//如果匹配图像上的边缘信息不为0,则计算float gxs = srcGx.at<float>(srcy, srcx);float gys = srcGy.at<float>(srcy, srcx);float gxr = srcModel.vModel[m].gx;float gyr = srcModel.vModel[m].gy;float magr = srcModel.vModel[m].mag;float mags = srcMag.at<float>(srcy, srcx);//如果分母不为0if (!((gxr == 0 && gyr == 0) || (gxs == 0 && gys == 0))) {//计算nccfloat ncc = calcAccNCC(gxr, gyr, gxs, gys, magr, mags);nccSum = ncc + nccSum;}}}nccMat.at<double>(i, j) = (float)nccSum;}}//若步进大于1 就二次搜索if (searchStep > 1){//先找到nccMat中像素值前三大的坐标double minVal1, maxVal1;int minIdx1[2] = {}, maxIdx1[2] = {};	// minnimum Index, maximum IndexminMaxIdx(nccMat, &minVal1, &maxVal1, minIdx1, maxIdx1);int maxX1 = maxIdx1[1];int maxY1 = maxIdx1[0];Mat nccMatForMaxIdx;nccMat.copyTo(nccMatForMaxIdx);nccMatForMaxIdx.at<double>(maxY1, maxX1) = minVal1;minMaxIdx(nccMatForMaxIdx, &minVal1, &maxVal1, minIdx1, maxIdx1);int maxX2 = maxIdx1[1];int maxY2 = maxIdx1[0];nccMatForMaxIdx.at<double>(maxY2, maxX2) = minVal1;minMaxIdx(nccMatForMaxIdx, &minVal1, &maxVal1, minIdx1, maxIdx1);int maxX3 = maxIdx1[1];int maxY3 = maxIdx1[0];//在像素点附近进行 步进为1的搜索searchSecondNcc(maxX1, maxY2, searchStep, d_width, d_height, srcGx, srcGy, srcMag, srcCannyMat, srcModel, nccMat);searchSecondNcc(maxX2, maxY2, searchStep, d_width, d_height, srcGx, srcGy, srcMag, srcCannyMat, srcModel, nccMat);searchSecondNcc(maxX3, maxY3, searchStep, d_width, d_height, srcGx, srcGy, srcMag, srcCannyMat, srcModel, nccMat);}// 这里要注意 arr[0] 代表坐标y ,arr[1]代表坐标x。double minVal, maxVal;int minIdx[2] = {}, maxIdx[2] = {};	// minnimum Index, maximum IndexminMaxIdx(nccMat, &minVal, &maxVal, minIdx, maxIdx);srcModel.resRect.x = maxIdx[1];srcModel.resRect.y = maxIdx[0];srcModel.resRect.height = srcModel.height;srcModel.resRect.width = srcModel.width;srcModel.score = maxVal;return 0;
}

【Ⅴ】searchSecondNcc 二级搜索:在某一特定点周围再以步进为1搜索

/******************************************************
searchSecondNcc:
二级搜索:在某一特定点周围再以步进为1搜索输入:
x:点的x坐标
y:点的y坐标
srcGx:图像在x方向的梯度大小图
srcGy:图像在y方向的梯度大小图
srcMag:用于计算ncc系数的图
srcCannyMat:图像的边缘信息图
nccMat:计算后的ncc图。
*******************************************************/
void searchSecondNcc(int x, int y, int searchStep, int d_width, int d_height, cv::Mat srcGx, cv::Mat srcGy, cv::Mat srcMag, cv::Mat srcCannyMat, sttTemplateModel& srcModel, cv::Mat& nccMat)
{int sx = (x - searchStep + 1) < 0 ? 0 : (x - searchStep + 1);int ex = (x + searchStep) > d_width ? d_width : (x + searchStep);int sy = (y - searchStep + 1) < 0 ? 0 : (y - searchStep + 1);int ey = (y + searchStep) > d_height ? d_height : (y + searchStep);int nEdge = srcModel.vModel.size();//开始遍历for (int i = sy; i < ey; i++){for (int j = sx; j < ex; j++){//遍历向量int cnt = 0;int nccSum = 0;for (int m = 0; m < nEdge; m++) {int dx = srcModel.vModel[m].x;int dy = srcModel.vModel[m].y;int srcx = j + dx;int srcy = i + dy;if (srcCannyMat.at<uchar>(srcy, srcx) == 255) {//如果匹配图像上的边缘信息不为0,则计算float gxs = srcGx.at<float>(srcy, srcx);float gys = srcGy.at<float>(srcy, srcx);float gxr = srcModel.vModel[m].gx;float gyr = srcModel.vModel[m].gy;float magr = srcModel.vModel[m].mag;float mags = srcMag.at<float>(srcy, srcx);//如果分母不为0if (!((gxr == 0 && gyr == 0) || (gxs == 0 && gys == 0))) {//计算nccfloat ncc = calcAccNCC(gxr, gyr, gxs, gys, magr, mags);nccSum = ncc + nccSum;}}}nccMat.at<double>(i, j) = (float)nccSum;}}
}

【2】测试图转外轮廓

【Ⅰ】孔洞填充(默认背景为黑)

//输入:待处理图像的二值图
//参数:背景颜色(黑还是白) 漫水填充的起始点(填充的是背景,一般选择(0,0))
//输出:填充后的二值图
void My_hole_filling(Mat& srcImage, Mat& dstImage,int color,Point &startPoint)
{// Floodfill from point (0, 0) 以点(0,0)为种子点,进行漫水填充/*int x = startPoint.x;int y = startPoint.y;*///srcImage.at<char>(x, y)if ( color== 255)		//背景为白{srcImage = ~srcImage;}Mat im_floodfill = srcImage.clone();floodFill(im_floodfill, startPoint, Scalar(255));//255// Invert floodfilled image 反转图像Mat im_floodfill_inv;bitwise_not(im_floodfill, im_floodfill_inv);// Combine the two images to get the foreground. 获得前景dstImage = (srcImage | im_floodfill_inv);dstImage = ~dstImage;
}

【Ⅱ】获取瓶子外轮廓

//获取瓶子外轮廓的函数
//输入:原图灰度图 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;}}}
}

【Ⅲ】测试图转外轮廓

//将测试图转换成与模板图相匹配的函数
//输入:测试图 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;
}

【3】总代码

int main()
{//改变控制台字体颜色system("color 02");//******************************************【0】获取测试文件夹路径和模板文件夹路径********************************************************////获取测试文件夹路径和模板文件夹路径cv::String path_test = "D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图/";cv::String path_template = "D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图/";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】模板处理********************************************************////计算每个temp每个像素点的dx,dy, mag,包括着坐标信息x, y,存入vector vModel中vector<sttTemplateModel> Template;for (int hh = 0;hh < tempMat_Nums;hh++){//计算dx,dy,magMat gradxMat, gradyMat,magMat;Mat abs_gradx, abs_grady;//求x方向的梯度Sobel(tempMat[hh], gradxMat, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(gradxMat, abs_gradx);		//绝对值//求y方向的梯度Sobel(tempMat[hh], gradyMat, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(gradyMat, abs_grady);		//绝对值//计算幅值//magnitude(gradxMat, gradyMat, magMat);//这里使用绝对值之和近似addWeighted(abs_gradx, 0.5, abs_grady, 0.5, 0, magMat);//convertScaleAbs(magMat, abs_magMat);//对Template进行赋值操作sttTemplateModel temp;temp.height = tempMat[hh].rows;temp.width = tempMat[hh].cols;vector <sttPxGrdnt> temmodel;//二维Mat转化为一维vector的temmodel(数据类型是sttPxGrdnt)for (int i = 0; i < tempMat[hh].rows; i++){for (int j = 0; j < tempMat[hh].cols; j++){sttPxGrdnt model;model.x = j;model.y = i;model.gx = abs_gradx.at<uchar>(i, j);model.gy= abs_grady.at<uchar>(i, j);model.mag= magMat.at<uchar>(i, j);//至此一个像素的model参数填充完成temmodel.push_back(model);}}//至此一张模板图的vModel参数填充完成//temmodel类型:vector <sttPxGrdnt>     temp.vModel类型:vector <sttPxGrdnt>  类型相同temp.vModel = temmodel;temp.score = 0;//至此一张模板图的sttTemplateModel参数填充完成rect不初始化,之后会填充的。Template.push_back(temp);}cout << "TemplateNum: " << Template.size() << endl;cout << "tempMat_Nums: " << tempMat_Nums << endl;//******************************************【3】加载测试图********************************************************////创建测试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 dispMat;//==============计算测试图的srcGx、srcGy、srcMag、srcCannyMat==================================Mat gradxMat, gradyMat, srcMag;Mat srcGx, srcGy;Mat srcCannyMat;//求x方向的梯度Sobel(testMat[j], gradxMat, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(gradxMat, srcGx);		//绝对值//求y方向的梯度Sobel(testMat[j], gradyMat, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(gradyMat, srcGy);		//绝对值//计算幅值//magnitude(gradxMat, gradyMat, magMat);//这里使用绝对值之和近似addWeighted(srcGx, 0.5, srcGy, 0.5, 0, srcMag);int test_mask_pxiels = 0;test_mask_pxiels = test_covertTo_Outer_contour(testMat[j], srcCannyMat, 40);cout << "test_mask_pxiels" << test_mask_pxiels << endl;//用每个模板去匹配测试图,并且找出每次结果的最佳匹配值,将值存入vector中vector<double>goodval;vector<Point>goodlock;int matchnum = 0;Point matchLoc;for (int i = 0;i < tempMat_Nums;i++){//sttTemplateModel tempinrepeat = Template[i];searchNcc(srcGx, srcGy, srcMag, srcCannyMat, 2, Template[i]);goodlock.push_back(Template[i].maxLoc);goodval.push_back(Template[i].score);show_probability(i,Template[i].score);//cout << i << "  " << maxVal << endl;}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;
}

结果:

获取地址成功
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\2.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\3.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\4.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\5.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\6.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\7.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\8.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\9.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\A.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\B.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\C.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\D.jpg
D:/opencv_picture_test/视觉项目resize后的图片夹/模板图片夹/更小的模板图\E.jpg
TemplateNum: 13
tempMat_Nums: 13
第0张测试图片的测试
test_mask_pxiels1416
推测: 2 7.76891e+09
推测: 3 6.08647e+09
推测: 4 8.46855e+09
推测: 5 8.03057e+09
推测: 6 8.2642e+09
推测: 7 7.32424e+09
推测: 8 4.21286e+09
推测: 9 6.60641e+09
推测: 10 6.11642e+09
推测: 11 5.44163e+09
推测: 12 3.30044e+09
推测: 13 3.50808e+09
推测: 14 4.77945e+09
推测: 4 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\10+波纹.jpg
第1张测试图片的测试
test_mask_pxiels1333
推测: 2 3.35523e+09
推测: 3 1.35581e+10
推测: 4 8.65575e+09
推测: 5 1.27386e+10
推测: 6 4.49022e+09
推测: 7 1.41066e+10
推测: 8 2.06567e+10
推测: 9 2.12286e+10
推测: 10 8.22353e+09
推测: 11 9.90977e+09
推测: 12 1.5269e+10
推测: 13 1.00363e+10
推测: 14 1.65281e+10
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\10+麻点.jpg
第2张测试图片的测试
test_mask_pxiels1345
推测: 2 1.01031e+10
推测: 3 8.67801e+09
推测: 4 1.19367e+10
推测: 5 1.19407e+10
推测: 6 1.10023e+10
推测: 7 1.16832e+10
推测: 8 6.69674e+09
推测: 9 1.03455e+10
推测: 10 7.78547e+09
推测: 11 8.65128e+09
推测: 12 6.30006e+09
推测: 13 7.85052e+09
推测: 14 7.66856e+09
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\10+气泡+瓶口破裂.jpg
第3张测试图片的测试
test_mask_pxiels1442
推测: 2 1.53585e+10
推测: 3 1.31416e+10
推测: 4 1.70326e+10
推测: 5 1.65049e+10
推测: 6 1.61574e+10
推测: 7 1.576e+10
推测: 8 9.58215e+09
推测: 9 1.12565e+10
推测: 10 1.33957e+10
推测: 11 1.10719e+10
推测: 12 7.99814e+09
推测: 13 8.02709e+09
推测: 14 8.7746e+09
推测: 4 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\10.jpg
第4张测试图片的测试
test_mask_pxiels1307
推测: 2 7.86552e+09
推测: 3 7.99583e+09
推测: 4 1.21866e+10
推测: 5 9.24638e+09
推测: 6 9.61011e+09
推测: 7 9.1374e+09
推测: 8 5.79389e+09
推测: 9 7.02821e+09
推测: 10 7.43108e+09
推测: 11 6.42511e+09
推测: 12 4.32574e+09
推测: 13 5.07164e+09
推测: 14 5.45143e+09
推测: 4 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\10_2.jpg
第5张测试图片的测试
test_mask_pxiels1179
推测: 2 5.15639e+09
推测: 3 5.14794e+09
推测: 4 5.48102e+09
推测: 5 5.47599e+09
推测: 6 5.4206e+09
推测: 7 5.76432e+09
推测: 8 5.54363e+09
推测: 9 5.41065e+09
推测: 10 6.1458e+09
推测: 11 6.50305e+09
推测: 12 4.81589e+09
推测: 13 4.78103e+09
推测: 14 4.99855e+09
推测: 11 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\11.jpg
第6张测试图片的测试
test_mask_pxiels1207
推测: 2 7.31454e+09
推测: 3 6.91087e+09
推测: 4 6.44054e+09
推测: 5 7.07961e+09
推测: 6 7.13823e+09
推测: 7 6.7975e+09
推测: 8 7.35677e+09
推测: 9 7.82278e+09
推测: 10 5.83812e+09
推测: 11 6.02332e+09
推测: 12 5.21921e+09
推测: 13 4.11696e+09
推测: 14 6.95839e+09
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\12.jpg
第7张测试图片的测试
test_mask_pxiels779
推测: 2 1.10956e+10
推测: 3 8.73321e+09
推测: 4 1.12175e+10
推测: 5 9.66985e+09
推测: 6 1.12074e+10
推测: 7 1.00132e+10
推测: 8 8.25873e+09
推测: 9 1.32147e+10
推测: 10 9.62355e+09
推测: 11 9.91485e+09
推测: 12 7.01122e+09
推测: 13 8.50425e+09
推测: 14 1.00896e+10
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\13+炸口.jpg
第8张测试图片的测试
test_mask_pxiels881
推测: 2 3.32404e+09
推测: 3 2.55615e+09
推测: 4 3.19277e+09
推测: 5 2.89486e+09
推测: 6 3.22644e+09
推测: 7 3.25131e+09
推测: 8 2.33429e+09
推测: 9 3.92018e+09
推测: 10 3.12022e+09
推测: 11 3.11579e+09
推测: 12 2.04237e+09
推测: 13 2.04328e+09
推测: 14 3.28055e+09
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\14.jpg
第9张测试图片的测试
test_mask_pxiels1768
推测: 2 1.99602e+09
推测: 3 1.12828e+09
推测: 4 1.53632e+09
推测: 5 1.47012e+09
推测: 6 1.57056e+09
推测: 7 1.76038e+09
推测: 8 8.7309e+08
推测: 9 1.6778e+09
推测: 10 1.42781e+09
推测: 11 1.37872e+09
推测: 12 7.19919e+08
推测: 13 1.24003e+09
推测: 14 1.26879e+09
推测: 2 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\2+料纹.jpg
第10张测试图片的测试
test_mask_pxiels1666
推测: 2 1.5527e+10
推测: 3 1.47107e+10
推测: 4 1.60174e+10
推测: 5 1.75179e+10
推测: 6 1.61053e+10
推测: 7 1.50694e+10
推测: 8 8.51156e+09
推测: 9 1.63962e+10
推测: 10 1.41407e+10
推测: 11 1.40457e+10
推测: 12 7.8593e+09
推测: 13 1.24679e+10
推测: 14 1.28981e+10
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\3.jpg
第11张测试图片的测试
test_mask_pxiels1618
推测: 2 2.15178e+09
推测: 3 2.36388e+09
推测: 4 2.12818e+09
推测: 5 2.3344e+09
推测: 6 2.346e+09
推测: 7 2.04907e+09
推测: 8 1.91143e+09
推测: 9 2.23518e+09
推测: 10 2.01474e+09
推测: 11 1.74694e+09
推测: 12 1.42347e+09
推测: 13 1.1717e+09
推测: 14 1.39725e+09
推测: 3 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\3_2.jpg
第12张测试图片的测试
test_mask_pxiels1786
推测: 2 2.52058e+09
推测: 3 1.82568e+09
推测: 4 2.61639e+09
推测: 5 2.62928e+09
推测: 6 2.43084e+09
推测: 7 2.7574e+09
推测: 8 1.66082e+09
推测: 9 2.32472e+09
推测: 10 1.89285e+09
推测: 11 2.25175e+09
推测: 12 1.32364e+09
推测: 13 1.50924e+09
推测: 14 1.53588e+09
推测: 7 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\4+厚底.jpg
第13张测试图片的测试
test_mask_pxiels1645
推测: 2 5.41047e+09
推测: 3 3.76042e+09
推测: 4 6.23646e+09
推测: 5 5.1281e+09
推测: 6 5.02001e+09
推测: 7 4.65652e+09
推测: 8 2.77086e+09
推测: 9 4.8981e+09
推测: 10 3.64862e+09
推测: 11 3.62146e+09
推测: 12 2.12629e+09
推测: 13 2.43897e+09
推测: 14 2.96858e+09
推测: 4 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\4+厚底2.jpg
第14张测试图片的测试
test_mask_pxiels1568
推测: 2 1.02309e+10
推测: 3 1.07811e+10
推测: 4 1.02411e+10
推测: 5 1.1357e+10
推测: 6 1.23884e+10
推测: 7 8.60844e+09
推测: 8 7.21905e+09
推测: 9 8.52574e+09
推测: 10 9.17857e+09
推测: 11 7.784e+09
推测: 12 5.68596e+09
推测: 13 5.94044e+09
推测: 14 6.46818e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\4+炸肩.jpg
第15张测试图片的测试
test_mask_pxiels1988
推测: 2 6.25886e+09
推测: 3 5.20353e+09
推测: 4 5.86726e+09
推测: 5 7.51986e+09
推测: 6 5.58032e+09
推测: 7 4.72602e+09
推测: 8 3.67791e+09
推测: 9 5.03681e+09
推测: 10 5.00086e+09
推测: 11 4.07587e+09
推测: 12 3.01887e+09
推测: 13 3.6537e+09
推测: 14 3.82125e+09
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\5+脖夹料.jpg
第16张测试图片的测试
test_mask_pxiels1882
推测: 2 3.20653e+10
推测: 3 2.76892e+10
推测: 4 2.76938e+10
推测: 5 3.50479e+10
推测: 6 2.36017e+10
推测: 7 3.38148e+10
推测: 8 2.91187e+10
推测: 9 4.04712e+10
推测: 10 2.89815e+10
推测: 11 3.27775e+10
推测: 12 2.32076e+10
推测: 13 2.00089e+10
推测: 14 3.54917e+10
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\5+肩薄.jpg
第17张测试图片的测试
test_mask_pxiels1858
推测: 2 5.82607e+09
推测: 3 5.5297e+09
推测: 4 5.42484e+09
推测: 5 7.30172e+09
推测: 6 5.48253e+09
推测: 7 5.47554e+09
推测: 8 4.01811e+09
推测: 9 5.99446e+09
推测: 10 5.02572e+09
推测: 11 5.20654e+09
推测: 12 4.07417e+09
推测: 13 4.18127e+09
推测: 14 4.8048e+09
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\5+气泡.jpg
第18张测试图片的测试
test_mask_pxiels2056
推测: 2 5.45695e+09
推测: 3 5.55576e+09
推测: 4 5.46873e+09
推测: 5 7.44879e+09
推测: 6 5.48393e+09
推测: 7 4.00633e+09
推测: 8 4.52542e+09
推测: 9 5.4767e+09
推测: 10 4.43553e+09
推测: 11 4.55286e+09
推测: 12 4.35857e+09
推测: 13 3.45853e+09
推测: 14 4.7197e+09
推测: 5 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\5+炸口.jpg
第19张测试图片的测试
test_mask_pxiels1948
推测: 2 6.65222e+09
推测: 3 6.07512e+09
推测: 4 6.65503e+09
推测: 5 7.16401e+09
推测: 6 7.486e+09
推测: 7 4.69526e+09
推测: 8 5.32825e+09
推测: 9 5.99114e+09
推测: 10 8.14169e+09
推测: 11 4.49538e+09
推测: 12 5.89747e+09
推测: 13 4.23926e+09
推测: 14 8.63315e+09
推测: 14 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\5+皱纹气泡.jpg
第20张测试图片的测试
test_mask_pxiels1499
推测: 2 1.10044e+10
推测: 3 9.56812e+09
推测: 4 1.08293e+10
推测: 5 1.21681e+10
推测: 6 1.14699e+10
推测: 7 1.15628e+10
推测: 8 6.91678e+09
推测: 9 1.30719e+10
推测: 10 9.61323e+09
推测: 11 1.0836e+10
推测: 12 6.1744e+09
推测: 13 9.67348e+09
推测: 14 8.75079e+09
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\6.jpg
第21张测试图片的测试
test_mask_pxiels1576
推测: 2 2.05596e+09
推测: 3 1.90442e+09
推测: 4 3.00622e+09
推测: 5 2.93261e+09
推测: 6 3.66942e+09
推测: 7 2.53279e+09
推测: 8 1.46139e+09
推测: 9 2.40446e+09
推测: 10 1.83032e+09
推测: 11 1.91043e+09
推测: 12 1.278e+09
推测: 13 1.30937e+09
推测: 14 1.85519e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\6_2.jpg
第22张测试图片的测试
test_mask_pxiels1563
推测: 2 3.96171e+09
推测: 3 3.72847e+09
推测: 4 5.03716e+09
推测: 5 4.4465e+09
推测: 6 6.02446e+09
推测: 7 4.15961e+09
推测: 8 2.45023e+09
推测: 9 3.58917e+09
推测: 10 3.6738e+09
推测: 11 3.8432e+09
推测: 12 2.19844e+09
推测: 13 2.67596e+09
推测: 14 2.98359e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\6_3.jpg
第23张测试图片的测试
test_mask_pxiels1567
推测: 2 6.35999e+09
推测: 3 4.53041e+09
推测: 4 6.83978e+09
推测: 5 7.42691e+09
推测: 6 6.37482e+09
推测: 7 7.4714e+09
推测: 8 3.77141e+09
推测: 9 6.40438e+09
推测: 10 4.32262e+09
推测: 11 4.06384e+09
推测: 12 2.8407e+09
推测: 13 3.31714e+09
推测: 14 4.10857e+09
推测: 7 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\7+厚底.jpg
第24张测试图片的测试
test_mask_pxiels1473
推测: 2 3.57902e+09
推测: 3 2.94167e+09
推测: 4 4.36023e+09
推测: 5 4.08142e+09
推测: 6 4.58802e+09
推测: 7 3.13068e+09
推测: 8 2.30722e+09
推测: 9 3.88275e+09
推测: 10 2.27335e+09
推测: 11 2.50362e+09
推测: 12 1.93677e+09
推测: 13 3.05888e+09
推测: 14 2.70974e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\7+厚底2.jpg
第25张测试图片的测试
test_mask_pxiels1391
推测: 2 1.00562e+10
推测: 3 1.05996e+10
推测: 4 1.02783e+10
推测: 5 1.10004e+10
推测: 6 1.35885e+10
推测: 7 8.84774e+09
推测: 8 1.17561e+10
推测: 9 1.13903e+10
推测: 10 8.9951e+09
推测: 11 9.04684e+09
推测: 12 6.17875e+09
推测: 13 7.90862e+09
推测: 14 8.86442e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\8.jpg
第26张测试图片的测试
test_mask_pxiels1520
推测: 2 8.57156e+09
推测: 3 7.44973e+09
推测: 4 8.3013e+09
推测: 5 7.10376e+09
推测: 6 8.81428e+09
推测: 7 8.1691e+09
推测: 8 7.15676e+09
推测: 9 8.1174e+09
推测: 10 6.4955e+09
推测: 11 6.68006e+09
推测: 12 4.7698e+09
推测: 13 5.97653e+09
推测: 14 5.61839e+09
推测: 6 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\8_2.jpg
第27张测试图片的测试
test_mask_pxiels1336
推测: 2 1.32233e+10
推测: 3 1.30193e+10
推测: 4 1.36028e+10
推测: 5 1.34414e+10
推测: 6 1.40028e+10
推测: 7 1.35393e+10
推测: 8 9.5189e+09
推测: 9 1.69174e+10
推测: 10 1.36004e+10
推测: 11 1.42358e+10
推测: 12 8.62458e+09
推测: 13 9.22531e+09
推测: 14 1.06515e+10
推测: 9 D:/opencv_picture_test/视觉项目resize后的图片夹/测试图片夹/更小的测试图\9.jpg

总结

感觉速度比之前的方法慢了好多,而且误判也很多,不知道是不是我写的有问题。明天再看

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

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

相关文章

第七章 再谈抽象

第七章 再谈抽象 对象魔法 多态&#xff1a;可对不同类型的对象执行相同的操作&#xff0c;而这些操作就像“被施了魔法”一样能够正常运行。(即&#xff1a;无需知道对象的内部细节就可使用它)&#xff08;无需知道对象所属的类&#xff08;对象的类型&#xff09;就能调用其…

c语言math乘法,JavaScript用Math.imul()方法进行整数相乘

1. 基本概念Math.imul()方法用于计算两个32位整数的乘积&#xff0c;它的结果也是32位的整数。JavaScript的Number类型同时包含了整数和浮点数&#xff0c;它没有专门的整型和浮点型。因此&#xff0c;Math.imul()方法能提供类似C语言的整数相乘的功能。我们将Math.imul()方法的…

java scanner_Java Scanner nextLong()方法与示例

java scanner扫描器类的nextLong()方法 (Scanner Class nextLong() method) Syntax: 句法&#xff1a; public long nextLong();public long nextLong(int rad);nextLong() method is available in java.util package. nextLong()方法在java.util包中可用。 nextLong() method…

技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一)

我一直在思考软件公司如何开源节流。当然&#xff0c;老板也在思考开源节流。当然&#xff0c;老板思考的开源节流在公司运营层面上&#xff0c;而我作为CTO&#xff0c;我考虑的则是在产品运营角度上来思考这个问题。否则&#xff0c;一个软件公司&#xff0c;它的生存与发展就…

梯度下降法预测波士顿房价以及简单的模型评估

目录原理代码关于归一化的思考原理 观察数据可知属性之间差距很大&#xff0c;为了平衡所有的属性对模型参数的影响&#xff0c;首先进行归一化处理。 每一行是一个记录&#xff0c;每一列是个属性&#xff0c;所以对每一列进行归一化。 二维数组归一化&#xff1a;1、循环方式…

Windows Phone 内容滑动切换实现

在新闻类的APP中&#xff0c;有一个经常使用的场景&#xff1a;左右滑动屏幕来切换上一条或下一条新闻。 那么通常我们该使用哪种方式去实现呢&#xff1f;可以参考一下Demo的实现步骤。 1&#xff0c;添加Windows Phone用户自定义控件。例如&#xff1a; 这里我为了演示的方便…

c语言interrupt函数,中断处理函数数组interrupt[]初始化

在系统初始化期间&#xff0c;trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表&#xff0c;让其指向ignore_intr函数)&#xff0c;而在这次初始化期间&#xff0c;系统的0~19号中断(用于分NMI和异常的中断向量)均被设置好。与此同时&#xff0c;用于…

bytevalue_Java Number byteValue()方法与示例

bytevalueNumber类byteValue()方法 (Number Class byteValue() method) byteValue() method is available in java.lang package. byteValue()方法在java.lang包中可用。 byteValue() method is used to return the value denoted by this Number object converted to type byt…

第二章 染色热力学理论单元测验

1,()测定是染色热力学性能研究的基础 吸附等温线。 2,吸附是放热反应,温度升高,亲和力() 减小 3,染色系统中包括() 染料。 染深色介质。 染色助剂。 纤维。 4,下列对状态函数特点叙述正确的为() 状态函数只有在平衡状态的系统中才有确定值。 在非平衡状态的系统…

使用鸢尾花数据集实现一元逻辑回归、多分类问题

目录鸢尾花数据集逻辑回归原理【1】从线性回归到广义线性回归【2】逻辑回归【3】损失函数【4】总结TensorFlow实现一元逻辑回归多分类问题原理独热编码多分类的模型参数损失函数CCETensorFlow实现多分类问题独热编码计算准确率计算交叉熵损失函数使用花瓣长度、花瓣宽度将三种鸢…

开源HTML5应用开发框架 - iio Engine

随着HTML5的发展&#xff0c;越来越多的基于HTML5技术的网页开发框架出现&#xff0c;在今天的这篇文章中&#xff0c;我们将介绍iio Engine&#xff0c;它是一款开源的创建HTML5应用的web框架。整个框架非常的轻量级&#xff0c;只有45kb大小&#xff0c;并且整合了debug系统&…

c语言double root,C语言修仙

root(1)(2/2)AD1AD4林浔合理推测&#xff0c;青城山剑宗&#xff0c;也就是祁云所在的剑修一脉&#xff0c;掌握着一些道修并不知道的传承。譬如——怎样找到赤霄龙雀剑&#xff0c;又或者&#xff0c;怎样使用它。这样一来&#xff0c;青城的守卫阵法没有反应也能解释了&#…

【转】Black Box

Introduction BlackBox是FPGA设计中一个重要的技巧&#xff0c;不过觉得Xilinx的文档没有很好地将它讲清楚。 BlackBox的主要想法就是把设计的某一个子模块单独综合&#xff0c;综合的结果作为一个黑盒子子模块&#xff0c;上层设计不再对这个模块进行优化&#xff0c;只能看到…

Java Compiler disable()方法与示例

编译器类disable()方法 (Compiler Class disable() method) disable() method is available in java.lang package. disable()方法在java.lang包中可用。 disable() method is used to cause the compiler to stop operation. disable()方法用于使编译器停止操作。 disable() m…

【神经网络计算】——神经网络实现鸢尾花分类

本blog为观看MOOC视频与网易云课堂所做的笔记 课堂链接&#xff1a; 人工智能实践:TensorFlow笔记 吴恩达机器学习 疑问与思考 为什么按照batch喂入数据 之前看的视频里面处理数据都是一次性将所有数据喂入&#xff0c;现在看的这个视频对数据进行了分组投入。这是为何&#…

第三章 染色动力学理论单元测试

1,准二级动力学模型认为,染色速率与()的二次方成正比 纤维上未被占满的位置(空位)数量 2,研究染色动力学的意义有() 了解染料走向平衡的速率。 初染速率。 匀染性。 3,求出染料的扩散系数的意义有() 了解各因素对扩散系数的影响。 求出不同温度下的扩散系数,计算…

CDOJ--1668

原题链接&#xff1a;http://acm.uestc.edu.cn/problem.php?pid1668 由于题目意思指的是将分数拆分成不同的单位分数之和&#xff0c;所以就不用考虑将2/3拆成1/31/3这种情况了&#xff1b;又由于好的拆分要求项数即len要少&#xff0c;最小的项要大&#xff0c;故可以采用迭代…

c# xaml语言教程,c#学习之30分钟学会XAML

1.狂妄的WPF相对传统的Windows图形编程&#xff0c;需要做很多复杂的工作&#xff0c;引用许多不同的API。例如&#xff1a;WinForm(带控件表单)、GDI(2D图形)、DirectXAPI(3D图形)以及流媒体和流文档等&#xff0c;都需要不同的API来构建应用程序。WPF就是看着上面的操作复杂和…

(Android实战)AsyncTask和Handler两种异步方式实现原理和优缺点比较

1 AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点…

Java Collections list()方法与示例

集合类list()方法 (Collections Class list() method) list() method is available in java.util package. list()方法在java.util包中可用。 list() method is used to return an array list that contains all the elements returned by the given Enumeration and the way o…