opencv图像轮廓提取,halcon获取轮廓的点

  opencv图像轮廓提取,halcon获取轮廓的点

  版权所有:本文引自http://blog.csdn.net/wsd GTX 2038/文章/详情/12889059。材料也是从这里获得的。这篇文章被部分修改。

  本文主要参考这个文档wsdgtx2038。转载时请注意原出处。

  本文主要介绍如何在Python中使用OpenCV检测和绘制等高线。

  轮廓检测

  轮廓检测也常用于图像处理。OpenCV-Python接口使用cv2.findContours))函数找到被检测对象的轮廓。

  实现方法如下。

  导入cv 2img=cv2.im read(。/test . jpg)(gray=cv2 . CVT color)img,cv2。COLOR_BGR2GRAY ) ret,binary=cv2 cv2

  请注意,由于cv2.findContours()函数接收的参数是二值图表或者黑白(不是灰度),所以读取的图像必须先转换成灰度,然后再转换成二值图表。请看4和5中的两行。第六行是检测轮廓,第七行是画轮廓。

  结果如下。

  测试结果如下。

  注意,findcontours功能“原位”修改输入图像。这可以通过下面的陈述来验证。

  cv2.imshow(二进制),binary(轮廓),hierarchy=cv2.find contours(二进制),cv2。RETR _树,cv2.chain_)

  2.cv2.findContours()函数的原型如下

  2.find contexts (image,mode,method[,contexts [,hierarchy[,offset]]]) opencv2表示轮廓中的两个音符:hierarchy: opencv3返回三个值。第一个参数是img、countours和hierarchy参数,用于查找轮廓图像。第二个参数指示大纲的检索模式。有四种。本文介绍了所有新的cv2接口。 cv2.RETR_EXTERNAL表示只检测外轮廓。

  cv2.RETR_LIST 检测到的配置文件没有建立层次关系。

  创建 cv2.RETR_CCOMP阶段的轮廓。上层是外边界,中间层是内孔的边界信息。当孔中有连接的对象时,对象的边界也在顶层。

   cv2.RETR_TREE创建分层树结构的轮廓。

  第三个参数method存储轮廓逼近法cv2.CHAIN_APPROX_NONE的所有轮廓点,相邻两点的像素位置差不大于1,即max(ABS(x1-x2),ABS (y2-y1) )=1。

   cv2.CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线方向的元素,只保留该方向端点的坐标。例如,矩形轮廓包含四个点的轮廓信息。

  使用33558 www.Sina.com/teh-chinlchain近似算法

  返回值cv2。findContours())函数返回两个值:配置文件本身和对应于每个配置文件的属性。

  Contour返回值cv2.findContours()函数首先返回列表。列表中的每个元素都是一个图像的轮廓,用numpy的ndarray表示。这个概念很重要。你可以在下面的等高线图上看到它。及格

  print(type(contours))print(type)contexts[0])(print(len)contours))

  以上信息可以验证。在这个例子中,你可以看到五角星和矩形。每个轮廓都是n数组,每个n数组都是轮廓上的一组点。

  我知道有两个轮廓,所以我可以通过。

  2.cv2.drawcontours(img,contours,0,),0,0,255),3)和

  2.画等高线(img,contours,1,(0,255,0),3)分别画两条等高线。有关该参数,请参见下一节。同时

  print(len(contours[0]))print(len(contours[1])

  输出存储在两个轮廓中的点数。正如您所看到的,在第一个大纲中只有4个元素。这是因为轮廓并不存储轮廓上的所有点,而只存储能用直线描述轮廓的点数,比如一个“直立”的矩形。只需要4个顶点来描述轮廓。

  Hierarchy返回值此外,该函数还可以返回一个可选的hierarchy结果,该结果是一个具有相同数量的元素和轮廓的ndarray。每个轮廓contours[i]对应四个层次元素,即hierarchy[I][0]~ hierarchy[I][3],分别代表后一个轮廓、前一个轮廓、父轮廓和父轮廓。

  及格

  print(type(hierarchy))print(hierarchy . ndim)print(hierarchy[0])。ndim)打印(hierarchy.shape)

  可以看出,层次结构本身包含两个ndarray,每个ndarray对应一个大纲,每个大纲有四个属性。

  在OpenCV中,通过cv2.drawContours在图像上绘制轮廓

  2.函数cv2.drawContours的第一个参数(image,Contours,contouridx,color [,thickness [,linetype [,hierarchy [,maxlevel [,offset]])表示在哪个图像上绘制轮廓;第二个参数是大纲本身,这是Python中的一个列表。第三个参数指定要绘制大纲列表中的哪个大纲,如果为-1,则绘制所有大纲。以下参数很简单。其中,thickness表示轮廓的宽度,如果它是-1(cv2。已填充),是填充模式。绘图参数将在以后单独详细描述。补充:

  OpenCV-Python教程(11,轮廓检测)_专栏of _wsdgtx2038 -CSDN博客_轮廓检测博客中提到轮廓的极值点可以用以下方法计算,如下

  五角星=轮廓[1]#第二个轮廓是五角星最左边=元组(五角星[:0][五角星[:0]。argmin ()])最右边=tuple(五角星[:0][五角星[:0]。argmin()])cv2.circle(img,最左边,2,(0,255,0),3)cv2.circle(img,最右边,2,(0,0,255),3)

  010-5900人民邮电出版社出版了一本《NumPy攻略:Python科学计算与数据分析》,推荐看看。

  注意!假设轮廓有100个点,OpenCV返回的ndarray的维数是(100, 1, 2)!!!而不是我们认为的(100, 2)。切记!!!

  在numpy的数组中,轴的索引用逗号分隔。例如,假设您有以下数组:

  a=np.array([[[3,4]],[[1,2]],[[5,7]],[[3,7]],[[1,8]])

  它的形状是(5,1,2)。和我们的大纲一样。那么[:0]的结果是:

  [3,4], [1,2], [5,7], [3,7], [1,8]

  这里,a[:0]表示a[0:5,0],即a[0:5,0:0:2]。这三个是等价的。

  回头看,A的形状是(5,1,2),说明它是三轴的。在numpy的数组中,轴的索引用逗号分隔。同时,冒号索引“:”表示轴的所有元素。因此,a[:0]表示第一个轴的所有元素和第二个轴的第一个元素。这里相当于a[0:5,0]。

  此外,如果给定的索引号小于数组中的总索引号,则默认情况下将给定的索引树分配给轴。比如a[0:5,0]只给出两个轴的索引,那么第一个索引是第一个轴,第二个索引是第二个轴,第三个索引没有,那么默认为[:],即那个轴的所有内容。因此,a[0:5,0]也等价于a[0:5,0:0:2]。

  更详细的说,A的全部内容是:[[3,4]],[[1,2]],[[5,7]],[[3,7]],[[1,8]]。去掉第一层方括号。有五个元素,每个元素都像[[3,4]],所以第一个索引的范围是[0:5]。更新:关于pentagram[:,0]的意思

  观察[[3,4]],发现只有一个元素,即[3,4],第二个指标是[0:1]。

  再去掉一层方括号。我们面对的是[3,4]。有两个元素,所以第三个索引的范围是[0:2]。

  再次强调OpenCVPython接口函数返回的NumPy数组与普通NumPy数组的组织区别。

  参考号:1《Opencv2 Computer Vision Application Programming Cookbook》

  2、 《OpenCV References Manule》

  3.OpenCV官方文档的轮廓部分

  关于Python opencv中值错误的专栏:太多值无法解包_ jjddss -CSDN博客

  Opencv3可能会报告要解包的值太多的错误(预期值为2)。最近在OpenCV-Python接口中使用了函数cv2.findContours()来查找被检测对象的轮廓。

  根据在线教程,PythonOpenCV的轮廓提取函数会返回两个值,第一个是轮廓的点集,第二个是每层轮廓的索引。但是我的程序在实际调用过程中报错,错误内容如下:要解包的值太多(预期2)

  实际上,返回值是不接受的。如果只用一个变量A接受返回值,调用len(a),会发现长度是3,也就是说这个函数实际上返回了三个值。

  第一个,也是最可怜的一个,返回你处理的第二个图像,也就是我们要找的,轮廓的第三个点集。每个层轮廓的索引使用如下:

  importcv2img=cv2.imread(./测试。jpg’)灰色=cv2。CVT颜色(img,cv2 .COLOR_BGR2GRAY)ret,binary=cv2.threshold(灰色,127,255,cv2 .THRESH_BINARY)轮廓,层次=cv2。查找轮廓(二进制,cv2 .获得文件树,cv2 .CHAIN _ APPROX _ SIMPLE)cv2。绘制轮廓(img,Contours,-1,(0,0,255),3)cv2.imshow(img ,img)cv2.waitKey(0)运行时出现错误:值错误:要解包的值太多

  原因:由于版本(使用的时3.2.0.7)问题简历。查找轮廓返回值个数发生变化,变为3个。因此应该为

  aa,ctrs,hier=cv2。查找轮廓(im _ th。复制(),cv2 .RETR _外部,cv2 .CHAIN_APPROX_SIMPLE)假如第一个参数不使用,可写成

  _,ctrs,hier=cv2。查找轮廓(im _ th。复制(),cv2 .RETR _外部,cv2 .CHAIN_APPROX_SIMPLE)拓展:

  值错误:要解包的值太多类错误,多为输入或者输出参数数量不一致导致。

  参考:

  OpenCV-Python教程(11、轮廓检测)_wsdgtx2038的专栏程序员博客_轮廓检测

郑重声明:本文由网友发布,不代表盛行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孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: