我是靠谱客的博主 顺利冷风,最近开发中收集的这篇文章主要介绍opencv--外接矩形(圆),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

轮廓外接矩形函数--Rect   boundingRect(InputArray Point)

函数的输入类型是Point类型的vector或Mat,返回类型是Rect对象;

代码

void main()
{
Mat srcImage=imread("12.jpg");
Mat tempImage=srcImage.clone();//做图像备份,因为findcontours会改变原图
imshow("srcImage",srcImage);
Mat dstImage;
Mat srcImageTh;//二值图
cvtColor(srcImage,srcImage,CV_BGR2GRAY);
threshold(srcImage,srcImageTh,100,255,THRESH_BINARY);//二值化(轮廓寻找前必备步骤)
vector<vector<Point>>contours;
//双层向量类型(二维数组[i][j])内部向量(相当于j数组)表示的是每一个轮廓的点,
//外部向量(相当于数组[i])表示的是以[j]数组为集合单位元素的数组,及以每一个轮廓为元素,表示的是总轮廓信息
findContours(srcImageTh,contours,RETR_EXTERNAL,CHAIN_APPROX_NONE);
for(int i=0;i<contours.size();i++)//contours.size()表示轮廓个数(因为contours表示的是总轮廓信息)
{
drawContours(tempImage,contours,i,Scalar(0,0,255));
}
vector<Rect>rect(contours.size());//指定rect向量大小为轮廓个数,定义为Rect类的向量(因为boundingRect返回的是Rect的对象)
for(int i=0;i<contours.size();i++)
{
rect[i]=boundingRect((Mat)contours[i]);//因为contours为二维数组,所以contours是以[i][0]为首地址,二维数组遍历的数组,及第i个轮廓的所有线条点
//boundingRect返回的是rect类对象,输入的是Point的向量
int x=rect[i].x;
int y=rect[i].y;
int h=rect[i].height;
int w=rect[i].width;
//因为rect向量是Rect类的,具有x,y,height,width的属性
rectangle(tempImage,Point(x,y),Point(x+h,y+w),Scalar(255,0,0));
}
imshow("result",tempImage);
imwrite("手.jpg",tempImage);
waitKey(0);
}

代码效果




二 轮廓的最小外接矩形 CV_EXPORTS_W RotatedRect minAreaRect( InputArray points );

minAreaRect的返回类型是RotateRect(旋转矩形类),输入参数是Mat或vector类的点集


代码

void main()
{
Mat srcImage=imread("画图1.png");
Mat tempImage=srcImage.clone();//进行图像的拷贝,因为findcontours会改变原图
Mat srcImageTh;
cvtColor(srcImage,srcImage,CV_BGR2GRAY);//彩色图转为灰度
threshold(srcImage,srcImageTh,100,255,THRESH_BINARY);//二值化
vector<vector<Point>>contours;//contours是一个二维向量,内层[j]是单个轮廓的线条点,外层是以轮廓为单位元素[j],表示所有轮廓信息
findContours(srcImageTh,contours,RETR_EXTERNAL,CHAIN_APPROX_NONE);
drawContours(tempImage,contours,-1,Scalar(255,0,0));
vector<RotatedRect>box(contours.size());//定义旋转矩形类向量rect,他的大小是轮廓的个数
Point2f rect[4]; 
for(int i=0;i<contours.size();i++)//contours.size()表示轮廓个数
{
box[i]=minAreaRect(Mat(contours[i]));//contours[i]表示的是单个轮廓的首地址是单个轮廓所有点的点集,是第一维向量,第i个轮廓的所有点转换成Mat类型
box[i].points(rect);//box[i]的成员函数points返回的就是point2f类的四个角点
//box[i].angle=//box[i]表示第i个最小外接矩形
circle(tempImage,Point(box[i].center.x,box[i].center.y),10,Scalar(0,255,0),2);//通过box[i](第i个最小外接矩形)的成员变量center获得中心点坐标
for(int j=0;j<4;j++)//rect[j]表示第j个角点坐标,因为是point2f类
{
line(tempImage,rect[j],rect[(j+1)%4],Scalar(0,0,255));//绘制矩形的每条边,(j+1)%4是在当j=3时使得第3个角点与第0个角点相连,及最后一边
}
}
imshow("result",tempImage);
waitKey(0);
}


代码效果






最后

以上就是顺利冷风为你收集整理的opencv--外接矩形(圆)的全部内容,希望文章能够帮你解决opencv--外接矩形(圆)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部