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

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

 

转载于:https://www.cnblogs.com/dzzy/p/9257735.html

C++OpenCV中,可以使用`cv::minAreaRect()`函数来计算轮廓的最小外接矩形。以下是一个简单的代码示例: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读取图像转换为灰度 Mat img = imread("image.jpg"); Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // 进行边缘检测 Mat edges; Canny(gray, edges, 50, 150); // 查找轮廓 std::vector<std::vector<Point>> contours; findContours(edges, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 绘制轮廓和最小外接矩形 Mat result = img.clone(); for (size_t i = 0; i < contours.size(); i++) { Scalar color = Scalar(0, 0, 255); drawContours(result, contours, i, color, 2); RotatedRect rect = minAreaRect(contours[i]); Point2f vertices[4]; rect.points(vertices); for (int j = 0; j < 4; j++) line(result, vertices[j], vertices[(j + 1) % 4], color, 2); } // 显示结果 imshow("result", result); waitKey(0); return 0; } ``` 在这个示例中,我们首先读取一张图像并将其转换为灰度。然后使用Canny算法进行边缘检测,并查找轮廓。使用`cv::minAreaRect()`函数计算每个轮廓的最小外接矩形,并将其绘制在原始图像上。最后,显示结果。 需要注意的是,`cv::minAreaRect()`函数返回的是一个旋转矩形(`RotatedRect`),它包含了最小外接矩形位置、大小和旋转角度等信息。我们可以使用`RotatedRect::points()`函数将其转换为四个顶点坐标,并使用`cv::line()`函数将这些点连接起来绘制出最小外接矩形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值