轮廓外接矩形函数--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); }
代码效果