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行 读一个白图目的是生成一个只含有矩形框的图片,不需要可以删掉

这样存在的问题是非连通区域不会合并成一个矩形,下一步需要一个合并算法

猜你喜欢

转载自www.cnblogs.com/dzzy/p/9257735.html