分享

cv2.drawContours

 ly88 2023-09-07 发布于山西

1.1什么是仿真
可以简单地认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。仿真在形状分析和物体的检测和识别中很有用。

  • 为了准确,要使用二值化图像。需要进行阀值化处理或者Canny边界检测。
  • 找到创建的函数会修改原始图像。之后如果想继续使用原始图像,应该将原始图像存储到其他数据中。
  • 在OpenCV中,找到了类似于在黑色背景中超白色的物体。你应该记住,要找到的物体应该是白色而背景应该是黑色。如何在一个二值图像中找到找到的。函数cv2.findContours()

    三个参数,第一个是输入图像,第二个是重建模式,第三个是估计方法。返回值有三个,第一个是图像,第二个是重建,第三个是(重建的) )层解析结构。其实(第二个返回值)是一个Python列表,其中存储这图像中所有的。每一个都是一个Numpy仓库,包含对象边界点(x,y)的坐标。 1.2 怎样的
    异构仿真
    函数 cv2.drawContours() 可以被用来进行异构。它可以根据你提供的局部点强度的任何形状。它的第一个参数是原始图像,第二个参数是仿真,一个python列表,第三个参数参数是模拟的参数(在近似独立成像上是很有用的,当设置为-1时近似所有模拟)。接下来的参数是模拟的颜色和厚度。在近似图像上近似所有的模拟
  1. import numpy as np
  2. import cv2
  3. img = cv2.imread('1024.jpg')
  4. imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  5. ret,thresh = cv2.threshold(imgray,127,255,0)
  6. image ,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  7. #绘制独立轮廓,如第四个轮廓
  8. #imag = cv2.drawContour(img,contours,-1,(0,255,0),3)
  9. #但是大多数时候,下面方法更有用
  10. imag = cv2.drawContours(img,contours,3,(0,255,0),3)
  11. while(1):
  12. cv2.imshow('img',img)
  13. cv2.imshow('imgray',imgray)
  14. cv2.imshow('image',image)
  15. cv2.imshow('imag',imag)
  16. if cv2.waitKey(1) == ord('q'):
  17. break
  18. cv2.destroyAllWindows()

1.3 模拟的估计方法
前面提到的是一个具有相同灰度值的边界的形状,它会存储形状边界上所有的(x,y)坐标。实际上我们不需要所有的点,当需要直线时,找到两个端点即可。cv2.CHAIN_APPROX_SIMPLE可以实现。它把拟上的旋转点去掉,压缩了一下,从而节省内存开支。下面用矩阵来演示,在单独的列表中的每个坐标上画一个
蓝色第一张显示使用cv2.CHAIN_APPROX_NONE的效果,总共734个点,第二个图是使用cv2.CHAIN_APPROX_SIMPLE的结果,只有4个点。

2.构造
2.1矩
图像的矩可以帮助我们计算图像的质心、面积等。
函数cv2.moments()分割计算得到的矩以一个字典的形式返回。

  1. import numpy as np
  2. import cv2
  3. img = cv2.imread('1024.jpg',0)
  4. ret,thresh = cv2.threshold(img,127,255,0)
  5. image,contours,hierarchy=cv2.findContours(thresh,1,2)
  6. cnt=contours[0]
  7. M=cv2.moments(cnt)
  8. print(M)

根据这些矩的值,我们可以计算出对象的重心:

  1. cx=int(M['m10']/M['m00'])
  2. cy=int(M['m01']/M['m00'])

2.2 面积
可以用函数cv2.contourArea()计算得到,也可以用矩(0阶矩),M['m00']。

area=cv2.contourArea(cnt)

2.3 假设周长
也被称为弧长。可以使用函数cv2.arcLength()计算得到。这个函数的第二个参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线)。

perimeter = cv2.arcLength(cnt,True)

2.4 模拟估计
将模拟形状估计为另一种由较少点组成的模拟形状,新模拟的点的概率由我们设定的准确度来决定,使用Douglas-Peucker算法,可以自己Google。假设我们
要在图像中创建一个曲面,但是由于图像的原因我们不能得到一个完美的曲面,而是一个“坏形状”,现在就可以用这个函数来近似这个形状,第二个参数是epsilon,是从原始估计到估计的最大距离,它是一个准确的度参数。

  1. epsilon=0.1*cv2.arcLength(cnt,True)
  2. approx = cv2.approxPolyDP(cnt,epsilon,True)

2.5 凸包
凸包与模拟有些近似,但不同,虽然情况下它们给出的结果是一样的。函数cv2.convexHull()可以用来检测一个圆是否具有凸性缺陷,并能修复缺陷。来说,凸性的曲线总是凸的,至少是平的。如果有地方凹进去了就被称为凸性缺陷。比如下一张的手,红色的曲线出来显示了手的凸包,凸性缺陷被双箭头标出来了。

hull = cv2.convexHull(points,hull,clockwise,returnPoints)

参数:

  • 我们要制定的要点
  • 船体输出,通常不需要
  • 顺时针方向标志,如果设置为True,输出的凸包是顺时针方向的,否则为逆时针方向。
  • returnPoints默认值为True。它会返回凸包上点的坐标,如果设置为False,就会返回与凸包点对应的一样上的点。要获取上图的凸包可以,用命令如下
hull=cv2.convexHull(cnt)

但是如果你想获得凸性缺陷,需要把returnPoints设置为False。以上面为例,首先我们从cnt找到他的仿真。现在把returnPoints设置为True查找凸包,得到的就是仿真的四个角点它将returnPoints设置为False,得到的是唯一点的索引。
2.6凸性检测
函数cv2.isContourConvex()可以检测一个曲线是不是凸的。只能返回True或者False。

k=cv2.isContourConvex(cnt)

2.7 外接圆弧
外接圆弧,一个直外接圆,没有旋转。不会考虑对象是否有外接圆旋转。所以外接圆弧的面积不是最小的。可以使用函数cv2.boundingRect()查找得到

  1. #(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高
  2. x,y,w,h=cv2.boundingRect(cnt)
  3. img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

旋转的边界是曲面,这个边界曲面是最小的,因为它考虑了对象的旋转。用函数cv2.minAreaRect()。返回一个Box2D结构,其中包含曲面最上角点坐标(x,y)曲面的宽和高(w,h)以及旋转角度。但是要比较这个近似需要拟合的4个角点,可以通过函数cv2.boxPoints()获得。
绿色为直线,红色为旋转直线。

2.8 最小外接圆
函数cv2.minEnendingCircle()可以帮助我们找到一个对象的外接圆。它是所有能够包括对象的圆中面积最小的一个。

  1. (x,y),radius = cv2.minEnclosingCircle(cnt)
  2. center = (int(x),int(y))
  3. radius = int(radius)
  4. img = cv2.circle(img,center,radius,(0,255,0),2)

2.9 简单
使用函数cv2.ellipse(),返回值其实就是轮廓旋转曲面的内切圆。

  1. ellipse = cv2.fitEllipse(cnt)
  2. img = cv2.ellipse(img,ellipse,(0,255,0),2)

2.10 直线连接
可以根据一个点连接出一条直线,同样我们也可以为图像中的白色点连接出一条直线。

  1. rows,cols = img.shape[:2]
  2. [vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)
  3. lefty=int((x*vy/vx)+y)
  4. righty=int(((cols-x)*vy/vx)+y)
  5. img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多