opencv中有矩形的Rect函數、圓形的circl函數等,那么任意形狀怎么取呢?方法1:點乘,將其形狀與圖像進行點乘,求其形狀對應的圖像形狀;方法2:用findContours函數得對應的形狀區域,其邊緣顯示類型可以通過設置參數可以控制;
方法1:點乘
1 //===============================對應灰度圖的區域segImage============================================================== 2 // 遍歷圖像 對每個非零像素值賦值為對應灰度圖的像素值 3 4 Mat zeroImage(Size(rioImage.cols, rioImage.rows), CV_8U, Scalar(0));//建立全0矩陣 5 for (int i = 0; i < closeImg.rows; i++)//行遍歷 6 { 7 8 unsigned char* ptr = (unsigned char*)closeImg.data + closeImg.step*i; 9 10 for (int j = 0; j < closeImg.cols; j++)//列遍歷 11 { 12 int intensity = ptr[j]; 13 if (intensity != 0) 14 15 { 16 zeroImage.at<uchar>(i, j) = rioImage.at<uchar>(i, j);//對應位置賦值為灰度圖像素 17 } 18 } 19 } 20 21 zeroImage.copyTo(segImage); 22 //imshow("segImage.jpg", segImage); 23 //waitKey(0); 24 }
對於一個區域,怎么進一步針對區域內部特征進行處理呢 ? 首先,我們要提取出來內部的某些特征才能說話,下面提取一些簡單的特征,話不多說見代碼:
1.平均數及方差參數:
1 Mat tempMean, tempStddv; 2 double MEAN, STDDV;// mean and standard deviation of the flame region 3 double m = mean(flameRectRegion)[0]; 4 //cout << "mean=" << m << endl; 5 meanStdDev(flameRectRegion, tempMean, tempStddv); 6 7 MEAN = tempMean.at<double>(0, 0); 8 STDDV = tempStddv.at<double>(0, 0); 9 //cout << "mean=" << MEAN << endl; 10 //cout << "stddv=" << STDDV << endl;
