增強后的圖像需要通過圖像處理獲得定量的值。在實際程序設計過程中,輪廓很多時候都是重要的分析變量。參考Halcon的相關函數,我增強了Opencv在這塊的相關功能。
//尋找最大的輪廓
VP FindBigestContour(Mat src){
int imax = 0; //代表最大輪廓的序號
int imaxcontour = -1; //代表最大輪廓的大小
std::vector<std::vector<cv::Point>>contours;
findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for (int i=0;i<contours.size();i++){
int itmp = contourArea(contours[i]);//這里采用的是輪廓大小
if (imaxcontour < itmp ){
imax = i;
imaxcontour = itmp;
}
}
return contours[imax];
}
就是直接返回最大的輪廓。
//尋找並繪制出彩色聯通區域
vector<VP> connection2(Mat src,Mat& draw){
draw = Mat::zeros(src.rows,src.cols,CV_8UC3);
vector<VP>contours;
findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
//由於給大的區域着色會覆蓋小的區域,所以首先進行排序操作
//冒泡排序,由小到大排序
VP vptmp;
for(int i=1;i<contours.size();i++){
for(int j=contours.size()-1;j>=i;j--){
if(contours[j].size()<contours[j-1].size()){
vptmp = contours[j-1];
contours[j-1] = contours[j];
contours[j] = vptmp;
}
}
}
//打印結果
for (int i=contours.size()-1;i>=0;i--){
Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
drawContours(draw,contours,i,color,-1);
}
return contours;
}
vector<VP> connection2(Mat src){
Mat draw;
return connection2(src,draw);
}
尋找聯通區域是經典的圖像處理過程。我采用輪廓分析方法進行解決;並且最后對不能區域繪制不同顏色,非常直觀。

