C++-OpenCV(0)-外接轮廓检测

1.数据源为8通道灰度图像
2.外接矩形、边缘轮廓、中心点    
3.周长、面积(几何积分值)
4.最大、最小外接矩形
5.外接圆,外接椭圆

 


C++-OpenCV(0)-外接轮廓检测

C++-OpenCV(0)-外接轮廓检测C++-OpenCV(0)-外接轮廓检测

C++-OpenCV(0)-外接轮廓检测C++-OpenCV(0)-外接轮廓检测

C++-OpenCV(0)-外接轮廓检测
1.数据源为8通道灰度图像

//转换成8通道
cvtColor(image, imageGray, COLOR_BGR2GRAY);

2.外接矩形、边缘轮廓、中心点 
 

  //mode:轮廓提取方式:RETR_EXTERNAL提取最外层,RETR_TREE 表示出其层次
  //method:轮廓逼近方式:CHAIN_APPROX_SIMPLE 4个点 ,CHAIN_APPROX_NONE 边线
  findContours(imageGray, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
//在哪绘制轮廓 -1 表示绘制所有的轮廓 绘制的颜色,线宽是2,如果为-1 就是填充;绘制的图色是8领域的
  drawContours(imageCopy, contours, -1, Scalar(0, 0, 255), 2, 8);

3.周长、面积(几何积分值)、中心点
 

/*contours存的是图片点阵
面积 contourArea
周长 arcLength
中心点
*/ 
for (int i = 0; i < contours.size(); i++)
 {
		Moments M = moments(contours[i]);
		int x = int(M.m10 / double(M.m00));//   x y点的均值   x方向坐标的总和/像素的总和
		int y = int(M.m01 / double(M.m00));//   y方向坐标的总和/像素的总和
		//几何积分:面积  周长
		double area = contourArea(contours[i]);
		double len = arcLength(contours[i], true);
		//Mark the center
		circle(imageCopy, Point(x, y), 10, Scalar(255, 0, 0), -1);
		
	}

4.最大、最小外接矩形
   最大外接矩形点阵:boundingRect(),rectangle()
   最小外接矩形点阵:minAreaRect(),polylines()

//最大外接矩形
  Rect box = boundingRect(contours[i]);
  rectangle(imageCopy, box, Scalar(0, 255, 0), 2, 8, 0);
//最小外接矩形
    imageCopy = image.clone();
	RotatedRect rotrect;
	Point2f rect_points[4];
	Mat boxPoints2f, boxPointsCov;
	for (size_t i = 0; i < contours.size(); i++) 
	{
		//获取最小外接矩形点阵
		rotrect = minAreaRect(contours[i]);
		boxPoints(rotrect, boxPoints2f);
		boxPoints2f.assignTo(boxPointsCov, CV_32S);
		//绘制多边型
		polylines(imageCopy, boxPointsCov, true, Scalar(0, 255, 255), 2);
	}
	imshow("minrectangle", imageCopy);

5.外接圆(点阵,圆心,半径),外接椭圆
   获取点阵:minEnclosingCircle() ;画圆:circle()
   获取点阵:fitEllipse();画圆:ellipse()

 

    //外接圆 圆心,半径
	imageCopy = image.clone();
	Point2f center;
	float radius;
	for (size_t i = 0; i < contours.size(); i++) 
	{
		minEnclosingCircle(contours[i], center, radius);
		circle(imageCopy, center, radius, Scalar(255, 125, 125), 2);
	}
	imshow("外接圆", imageCopy);
	waitKey(0);
	
	//外接椭圆
	imageCopy = image.clone();
	RotatedRect rellipse;
	for (size_t i = 0; i < contours.size(); i++) {
		if (contours[i].size() < 5)
			continue;
		rellipse = fitEllipse(contours[i]);
		ellipse(image, rellipse, Scalar(255, 0, 125), 2);
	}
	imshow("外接椭圆", image);

   
  

 

原文链接: https://www.cnblogs.com/jasmineTang/p/14515488.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++-OpenCV(0)-外接轮廓检测

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/208735

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午11:33
下一篇 2023年2月12日 下午11:33

相关推荐