Opencv 图片边缘检测和最小外接矩形
1 #include "core/core.hpp" 2 #include "highgui/highgui.hpp" 3 #include "imgproc/imgproc.hpp" 4 #include "iostream" 5 #include "cmath" 6 using namespace std; 7 using namespace cv; 8 9 int main(int argc,char *argv[]) 10 { 11 12 Mat imageOut=imread(argv[1],1); 13 Mat imageSource=imread(argv[1],0); 14 Mat image; 15 blur(imageSource,image,Size(3,3)); 16 threshold(image,image,0,255,CV_THRESH_OTSU); 17 18 //寻找最外层轮廓 19 vector<vector<Point> > contours; 20 vector<Vec4i> hierarchy; 21 findContours(image,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); 22 Mat imageContours=Mat::zeros(image.size(),CV_8UC1); //最小外接矩形画布 23 24 Mat imageTemp=imread("C:\\Users\\Administrator\\Desktop\\Rec\\temp.png",1); //读一个大小一样的白图 25 26 for(int i=0; i<contours.size(); i++) 27 { 28 //cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl; 29 //绘制轮廓 30 drawContours(imageContours,contours,i,Scalar(0,0,0),1,8,hierarchy); 31 32 //cout<<"*"<<i<<" "<<contours.size()<<endl; 33 //绘制轮廓的最小外结矩形 34 RotatedRect rect=minAreaRect(contours[i]); 35 Point2f P[4]; 36 rect.points(P); 37 if(!(P[1].x==P[0].x && P[2].x==P[3].x && P[1].y==P[2].y && P[0].y==P[3].y 38 && P[0].y-P[1].y>0 && P[3].x-P[0].x>0 )) 39 continue; 40 41 for(int j=0; j<=3; j++) 42 { 43 line(imageSource,P[j],P[(j+1)%4],Scalar(0,0,0),2); //二值图绘线 44 line(imageOut,P[j],P[(j+1)%4],Scalar(0,0,0),2); //原图绘线 45 line(imageTemp,P[j],P[(j+1)%4],Scalar(0,0,0),2); //白图 46 } 47 48 //system("pause"); 49 } 50 cout<<"!"; 51 imwrite("C:\\Users\\Administrator\\Desktop\\Rec\\new1.png", imageSource); 52 imwrite("C:\\Users\\Administrator\\Desktop\\Rec\\new2.png", imageOut); 53 imwrite("C:\\Users\\Administrator\\Desktop\\Rec\\new3.png", imageTemp); 54 //imshow("MinAreaRect",imageSource);// 55 waitKey(0); 56 return 0; 57 }
24行 读一个白图目的是生成一个只含有矩形框的图片,不需要可以删掉
这样存在的问题是非连通区域不会合并成一个矩形,下一步需要一个合并算法