【視覺項目】基于梯度的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.pswp.cn/news/378339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378339.shtml
英文地址,請注明出處:http://en.pswp.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…