opencv之轮廓特征属性及应用

1)最小外接圆
轮廓最小外接圆–minEnclosingCircle()
void minEnclosingCircle(InputArray points,CV_OUT Point2f&center,CV_OUT float&radius);
&&points:输入的二维点集,可以填Mat类型或者std::vector
&&center:Point2f&类型的center,圆的输出圆心
&&radius:float类型,表示圆的输出半径

//绘制轮廓的外接圆
Mat srcImg=imread("10.png");
imshow("src",srcImg);
Mat dstImg=srcImg.clone();
GaussianBlur(srcImg,srcImg,Size(3,3),0,0);
cvtColor(srcImg,srcImg,CV_BGR2GRAY);
Canny(srcImg,srcImg,100,200);
imshow("Canny",srcImg);
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findContours(srcImg,contours,hierarcy,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
cout<<"num="<<contours.size()<<endl;
vector<Rect>boundRect(contours.size());
vector<RotatedRect>box(contours.size());
Point2f rect[4];
Point2f center;//定义圆的中心坐标
float radius;//定义圆的半径
for(int i=0;i<contours.size();i++)//遍历轮廓
{
  minEnclosingCircle(Mat(contours[i],center,radius));
  boundRect[i]=boundingRect(Mat(contours[i]));
  drawContours(dstImg,contours,i,Scalar(0,0,255),2,8);
  circle(dstImg,center,radius,Scalar(0,255,0),2,8);

}
imshow("dst",dstimg);

2)椭圆拟合
轮廓椭圆拟合–fitEllipse()
RatatedRect fitEllipse(InputArray points);
&& points:输入的二维点集,可以填Mat类型,或者std::vector
&&返回值:RotatedRect类旋转矩形对象

//轮廓的椭圆拟合
vector<RotatedRect>box(contours.size());
Point2f rect[4];
for(int i=0;i<contours.size();i++)
{
  box[i]=fitEllipse(Mat(contours[i]));
  box[i].points(rect);
  ellipse(dstImg,boc[i],Scalar(0,255,0),2,8);
}
imshow("dst",dstzImg);
waitKey(0);

3)逼近多边形曲线
逼近多边形曲线–approxPolyDP()
void approxPolyDP(InputArray curve,OutputArray approxCurve,double epsilon,bool closed);
&&curve:输入的二维点集,可以填Mat类型或std::vector
&&approxCurve:多边形逼近的结果,其类型和输入二维点集类型一致
&&epsilon:逼近的精度,为原始曲线和近似曲线间的最大值
&&closed:如果其为真,则近似的曲线为封闭曲线,否则近似的曲线不封闭

//轮廓的多边形逼近
vector<vector<Point>contours_poly(contours.size());
for(int i=0;i<contours.size();i++)
{
  approxPolyDP(Mat(contous[i],contours_poly[i],3,true);
  drawContours(dstImg,contours,i,Scalar(0,255,255),2,8);
  drawContors(dstImg2,contours_poly,i,Scalar(0,255,255),2,8);//绘制多边形逼近
}
imshow("dst",dstImg);
inshow("approx",dstImg2);
waitKey(0);

4)计算轮廓面积
计算轮廓面积–contourArea()
double contourArea(InputArray contour,bool oriented=false);
&&contour:输入的二维点集或轮廓,可以填Mat类型或std::vector
&&oriented:默认值false,表示返回面积为绝对值,负则带符号
&&返回值:double类型返回轮廓面积
5)计算轮廓长度(周长或者曲线长度)
计算轮廓长度 –arcLength()
double arcLength(InputArray curve,bool closed);
&&curve:输入的二维点集,可以填Mat类型或者std::vector
&&colsed:用于指示曲线是否封闭的标识符 ,默认值true,表示曲线封闭
&&返回值:double类型返回轮廓长度
注:contourArea()&&arcLength()可用于轮廓的筛选

vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findContours(srcImg,contours,hierarcy,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
cout<<"num="<<contours.size()<<endl;
for(int i=0;i<contours.size();i++)
{
double area=contourArea(contous[i]);
double length=arcLength(contours[i],true);
if(length>300)
  drawContours(dstImg,contours,i,Scalar(0,0,255),2,8);
}
imshow("dst",dstImg);
waitKey(0);

6)利用mask提取不规则轮廓

//提取不规则轮廓
Mat srcImg=imread("220。jpg");
imshow("src",srcImg);
Mat dstImg=srcImg.clone();
Mat tempImg=srcImg.clone();//原图备份
Mat tempImg2(srcImg.rows,srcImg.cols,CV_8UC3,Scalar:all(0));
Mat draw(srcImg.rows,srcImg.cols,CV_8UC3,Scalar:all(0));
Mat tempImg3(srcImg,.rows,srcImg.cols,CV_8UC3,Scalar::all(0));
GaussianBlur(srcImg,srcImg,Size(3,3),0,0);
cvtColor(srcImg,srcImg,CV_BGR2GRAY);
threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);
imshow("threshold",srcImg);
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findContours(srcImg,contours,hierarcy,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
while(1)
{
   for(int i=0;i<contours.sizez();i++)
   {
   tempImg2.copyTo(draw);//每次进入将draw清空为全黑
   tempImg2.copyTo(tempImg3);//每次进入将tempImg3清空为全黑
   drawContours(draw,contours,i,Scalar(255,255,255),-1,8);
   Mat mask;
   cvtColor(draw,mask,CV_BGR2GRAY);
   tempImh.copyTo(tempImg3,mask);//将tempImg复制到tempImg3(只有mask部分被复制)
   imshow("draw",draw);
   imshow("result",tempImg3);
   }
   break;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的OpenCV(Open Source Computer Vision)库是一个用于计算机视觉和图像处理的强大工具。它提供了许多功能和算法,其中包括识别轮廓。 在OpenCV中,轮廓是由一组连接在一起的点组成的曲线,它描述了图像中的对象边缘。识别轮廓在许多图像处理和计算机视觉应用中非常常见,比如形状分析、对象检测和跟踪等。 要识别轮廓,首先我们需要把图像转换成灰度图像。这可以通过使用OpenCV的cv2.cvtColor()函数将图像从BGR格式(默认)转换为灰度格式来实现。接下来,我们需要使用cv2.threshold()或cv2.Canny()函数将图像转换为二值图像。这将使得轮廓更明显并且更容易识别。 一旦我们得到了二值图像,我们可以使用cv2.findContours()函数来查找图像中的轮廓。这个函数返回一个由轮廓点组成的列表,每个轮廓都表示为一个Numpy数组。我们还可以通过传递适当的参数来控制轮廓的检测和过滤。 接下来,我们可以使用cv2.drawContours()函数将找到的轮廓绘制到原始图像上,以便我们能够可视化和分析它们。我们可以选择绘制所有的轮廓或者仅绘制特定的轮廓。 最后,我们可以对识别到的轮廓进行进一步的分析和处理。OpenCV提供了很多函数来计算轮廓的形状属性,比如周长、面积、凸包等。我们可以利用这些属性来进行对象分类或者执行其他图像处理任务。 总结来说,通过使用Python的OpenCV库,我们可以轻松地识别并处理图像中的轮廓。这为我们提供了一个强大的工具来进行形状分析、对象检测和跟踪等计算机视觉任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值