opencv求轮廓中心,opencv判断点在轮廓内

  opencv求轮廓中心,opencv判断点在轮廓内

  本文主要介绍python计算机视觉来确定opencv矩形轮廓的顶点位置。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010一、问题介绍二。解决问题的方法一、方法二。一些实现代码

  

目录

 

  Opencv在图像处理方面有非常强大的功能。当我们需要使用opencv对一些图像进行校正时,通常需要找到原始图像的一些关键点,然后计算变换后图像的坐标,最后通过仿射变换或者透视变换得到我们想要的校正后的图像。比如纠正一张歪歪扭扭的纸,我们的首要任务就是找到原图的一些关键点。通常的做法是找到纸的四个顶点。

  

一、问题的引入

 

  第一步,我们必须找到相应的纸的矩形轮廓,可以通过二值化或使用一些算子来搜索。本文的重点是如何确定矩形轮廓的具体四个顶点。

  

二、问题的解决方法

 

  利用线性规划的方法,在opencv的坐标系中用两条直线x y=z1和x y=Z2切割轮廓。z1最大时,(x,y)为右下点,最小为左上点。z2最大时,(x,y)为右上点,最小为左下点,如下图:

  从轮廓的角度来说,只要旋转角度不只是45或135,这种方法就没有问题。它得到的是轮廓对应的右下点、左上点、右上点、左下点,而不是原目标对应的点。就像当纸张旋转超过45时,这个方法得到的对于轮廓是正确的,而对于纸张是不正确的,如下图所示。

  这时候你再像以前那样改正,就会得到一张横着的纸,这样里面的字就是横着的,这不是我们想要的。所以如果要用这种方法进行校正,就需要计算和判断图像的旋转角度。您可以通过以下代码获得角度:

  # cnt3360输入轮廓,角度:返回角度

  (x,y),(ma,MA),角度=cv2.fitEllipse(cnt)

  

方法一:

 

  该方法首先利用轮廓获得其最小面积矩,然后可以观察和研究矩形的性质。根据当前形状,可以给出合适的X和Y判断公式。观察下图:

  #求轮廓的最小力矩cnt:轮廓框:4点是不规则的

  rect=cv2 . minarerect(CNT)

  box=cv2.boxPoints(rect)

  对于这样一个长宽比很高的矩形,我们的方法是把四个点按照Y从小到大排序,然后取前两个点按照X从小到大排序,小的是左下,大的是右下;后两个也是按x排序,小一点的是左上,大一点的是右上。如果是长宽比为x的矩形,我们可以先按照x的大小排序。从代码上看,这种实现可能更简洁,适用于特定的轮廓,角度要求会更广,除非旋转到上图右边这种情况,这样修正的概率一般很小。

  

方法二

 

  1.下面是第一种方法实现的顶点定位。

  将numpy作为np导入

  导入cv2

  def get 4 points(img : NP . ndarray,thed,n):

  :param img形状为[高、宽、深]的彩色图像

  :返回列表或元组中的4个点位置,例如: [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]

  #灰度和二值化

  gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)

  ret,binary=cv2.threshold(gray,thed,255,cv2。THRESH_BINARY)

  #搜索大纲

  contours,hierarchy=cv2.findContours(

  二进制,

   cv2.RETR_LIST,

   cv2.CHAIN_APPROX_SIMPLE)

   #按轮廓长度选取需要轮廓

   len_list = []

   for i in range(len(contours)):

   len_list.append(len(contours[i]))

   #选第二长的

   sy = np.argsort(np.array(len_list))[-n]

   #寻找顶点

   sum_list = []

   dif_list = []

   for i in contours[sy]:

   sum = i[0][0]+i[0][1]

   sum_list.append(sum)

   dif_list.append(i[0][0]-i[0][1])

   id_lb = np.argsort(np.array(sum_list))

   id_lb2 = np.argsort(np.array(dif_list))

   lu_id , rd_id = id_lb[0] , id_lb[-1]

   ld_id , ru_id = id_lb2[0] , id_lb2[-1]

   points = np.array([contours[sy][lu_id][0],contours[sy][rd_id][0],contours[sy][ld_id][0],contours[sy][ru_id][0]])

   return points , contours , sy

  

  2、下面是使用方法2实现的顶点定位

  

def getpoints(binary: np.ndarray , num: int ):

 

  3、下面是一些展示代码

  

  #展示顶点  def show_points(img , points):   point_size = 8   point_color = (0, 0, 255) # BGR   thickness = 4 # 可以为 0 、4、8   points_list = [tuple(i) for i in np.int32(points).reshape(-1,2)]   for point in points_list:   cv2.circle(img, point, point_size, point_color, thickness)   img = cv2.resize(img,(808,808))   cv2.imshow(img,img)   cv2.waitKey(0)   cv2.destroyAllWindows()   # cv2.imwrite(dd.jpg,img)  #展示轮廓  def show_Contour(img , contours , sy):   cv2.drawContours(img, contours , sy , (25, 254, 0), 4)   img = cv2.resize(img,(808,808))   cv2.imshow(img,img)   cv2.waitKey(0)   cv2.destroyAllWindows()   # cv2.imwrite(mm.jpg,img)  

 

  以上就是python计算机视觉opencv矩形轮廓顶点位置确定的详细内容,更多关于python opencv矩形轮廓顶点定位的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: