1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      cv2.drawContours怎么使用

      本篇內(nèi)容主要講解“cv2.drawContours怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“cv2.drawContours怎么使用”吧!

      公司主營業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出鶴城免費(fèi)做網(wǎng)站回饋大家。

      1.1什么是輪廓
      輪廓可以簡(jiǎn)單認(rèn)為成連續(xù)的點(diǎn)(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測(cè)和識(shí)別中很有用。

      • 為了準(zhǔn)確,要使用二值化圖像。需要進(jìn)行閥值化處理或者Canny邊界檢測(cè)。

      • 查找輪廓的函數(shù)會(huì)修改原始圖像。如果之后想繼續(xù)使用原始圖像,應(yīng)該將原始圖像儲(chǔ)存到其他變量中。

      • 在OpenCV中,查找輪廓就像在黑色背景中超白色物體。你應(yīng)該記住,要找的物體應(yīng)該是白色而背景應(yīng)該是黑色。
        如何在一個(gè)二值圖像中查找輪廓。
        函數(shù)cv2.findContours()有三個(gè)參數(shù),第一個(gè)是輸入圖像,第二個(gè)是輪廓檢索模式,第三個(gè)是輪廓近似方法。返回值有三個(gè),第一個(gè)是圖像,第二個(gè)是輪廓,第三個(gè)是(輪廓的)層析結(jié)構(gòu)。輪廓(第二個(gè)返回值)是一個(gè)Python列表,其中儲(chǔ)存這圖像中所有輪廓。每一個(gè)輪廓都是一個(gè)Numpy數(shù)組,包含對(duì)象邊界點(diǎn)(x,y)的坐標(biāo)。
        1.2怎樣繪制輪廓
        函數(shù)cv2.drawContours()可以被用來繪制輪廓。它可以根據(jù)你提供的邊界點(diǎn)繪制任何形狀。它的第一個(gè)參數(shù)是原始圖像,第二個(gè)參數(shù)是輪廓,一個(gè)python列表,第三個(gè)參數(shù)是輪廓的索引(在繪制獨(dú)立輪廓是很有用,當(dāng)設(shè)置為-1時(shí)繪制所有輪廓)。接下來的參數(shù)是輪廓的顏色和厚度。
        在一幅圖像上繪制所有的輪廓:

      import numpy as np
      import cv2
      
      img = cv2.imread('1024.jpg')
      imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      ret,thresh = cv2.threshold(imgray,127,255,0)
      image ,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
      #繪制獨(dú)立輪廓,如第四個(gè)輪廓
      #imag = cv2.drawContour(img,contours,-1,(0,255,0),3)
      #但是大多數(shù)時(shí)候,下面方法更有用
      imag = cv2.drawContours(img,contours,3,(0,255,0),3)
      
      while(1):
          cv2.imshow('img',img)
          cv2.imshow('imgray',imgray)
          cv2.imshow('image',image)
          cv2.imshow('imag',imag)
          if cv2.waitKey(1) == ord('q'):
              break
      cv2.destroyAllWindows()

      1.3輪廓的近似方法
      之前提到輪廓是一個(gè)形狀具有相同灰度值的邊界,它會(huì)存儲(chǔ)形狀邊界上所有的(x,y)坐標(biāo)。實(shí)際上我們不需要所有的點(diǎn),當(dāng)需要直線時(shí),找到兩個(gè)端點(diǎn)即可。cv2.CHAIN_APPROX_SIMPLE可以實(shí)現(xiàn)。它會(huì)將輪廓上的冗余點(diǎn)去掉,壓縮輪廓,從而節(jié)省內(nèi)存開支。
      下面用矩陣來演示,在輪廓列表中的每一個(gè)坐標(biāo)上畫一個(gè)藍(lán)色圓圈。第一個(gè)顯示使用cv2.CHAIN_APPROX_NONE的效果,一共734個(gè)點(diǎn),第二個(gè)圖是使用cv2.CHAIN_APPROX_SIMPLE的結(jié)果,只有4個(gè)點(diǎn)。
      cv2.drawContours怎么使用

      2.輪廓特征
      2.1矩
      圖像的矩可以幫助我們計(jì)算圖像的質(zhì)心,面積等。
      函數(shù)cv2.moments()會(huì)將計(jì)算得到的矩以一個(gè)字典的形式返回。

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

      根據(jù)這些矩的值,我們可以計(jì)算出對(duì)象的重心:

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

      2.2輪廓面積
      可以使用函數(shù)cv2.contourArea()計(jì)算得到,也可以用矩(0階矩),M['m00']。

      area=cv2.contourArea(cnt)

      2.3輪廓周長
      也被稱為弧長??梢允褂煤瘮?shù)cv2.arcLength()計(jì)算得到。這個(gè)函數(shù)的第二參數(shù)可以用來指定對(duì)象的形狀是閉合的(True),還是打開的(一條曲線)。

      perimeter = cv2.arcLength(cnt,True)

      2.4輪廓近似
      將輪廓形狀近似到另外一種由更少點(diǎn)組成的輪廓形狀,新輪廓的點(diǎn)的數(shù)目由我們?cè)O(shè)定的準(zhǔn)確度來決定,使用的Douglas-Peucker算法,可以自己Google。
      假設(shè)我們要在一幅圖像中查找一個(gè)矩形,但是由于圖像的種種原因我們不能得到一個(gè)完美的矩形,而是一個(gè)“壞形狀”,現(xiàn)在就可以使用這個(gè)函數(shù)來近似這個(gè)形狀,第二個(gè)參數(shù)是epsilon,它是從原始輪廓到近似輪廓的最大距離,它是一個(gè)準(zhǔn)確度參數(shù)。

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

      2.5凸包
      凸包與輪廓近似相似,但不同,雖然有些情況下它們給出的結(jié)果是一樣的。函數(shù)cv2.convexHull()可以用來檢測(cè)一個(gè)曲線是否具有凸性缺陷,并能糾正缺陷。一般來說,凸性曲線總是凸出來的,至少是平的。如果有地方凹進(jìn)去了就被叫做凸性缺陷。例如下圖中的手,紅色曲線顯示了手的凸包,凸性缺陷被雙箭頭標(biāo)出來了。
      cv2.drawContours怎么使用

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

      參數(shù):

      • points我們要傳入的輪廓

      • hull輸出,通常不需要

      • clockwise方向標(biāo)志,如果設(shè)置為True,輸出的凸包是順時(shí)針方向的,否則為逆時(shí)針方向。

      • returnPoints默認(rèn)值為True。它會(huì)返回凸包上點(diǎn)的坐標(biāo),如果設(shè)置為False,就會(huì)返回與凸包點(diǎn)對(duì)應(yīng)的輪廓上的點(diǎn)。
        要獲得上圖的凸包,可以用下面命令:

      hull=cv2.convexHull(cnt)

      但是如果你想獲得凸性缺陷,需要把returnPoints設(shè)置為False。以上面矩形為例,首先我們找到他的輪廓從cnt?,F(xiàn)在把returnPoints設(shè)置為True查找凸包,得到的就是矩形的四個(gè)角點(diǎn)。把returnPoints設(shè)置為False,得到的是輪廓點(diǎn)的索引。
      2.6凸性檢測(cè)
      函數(shù)cv2.isContourConvex()可以檢測(cè)一個(gè)曲線是不是凸的。它只能返回True或者False。

      k=cv2.isContourConvex(cnt)

      2.7邊界矩形
      直邊界矩形,一個(gè)直矩形,沒有旋轉(zhuǎn)。不會(huì)考慮對(duì)象是否旋轉(zhuǎn)。所以邊界矩形的面積不是最小的??梢允褂煤瘮?shù)cv2.boundingRect()查找得到

      #(x,y)為矩形左上角的坐標(biāo),(w,h)是矩形的寬和高
      x,y,w,h=cv2.boundingRect(cnt)
      img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

      旋轉(zhuǎn)的邊界矩形,這個(gè)邊界矩形是面積最小的,因?yàn)樗紤]了對(duì)象的旋轉(zhuǎn)。用函數(shù)cv2.minAreaRect()。返回的是一個(gè)Box2D結(jié)構(gòu),其中包含矩形最上角角點(diǎn)坐標(biāo)(x,y)矩形的寬和高(w,h)以及旋轉(zhuǎn)角度。但是要繪制這個(gè)矩形需要矩形的4個(gè)角點(diǎn),可以通過函數(shù)cv2.boxPoints()獲得。
      其中綠色的為直矩形,紅色為旋轉(zhuǎn)矩形。

      2.8最小外接圓
      函數(shù)cv2.minEnclosingCircle()可以幫我們找到一個(gè)對(duì)象的外接圓。它是所有能夠包括對(duì)象的圓中面積最小的一個(gè)。

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

      cv2.drawContours怎么使用

      2.9橢圓擬合
      使用函數(shù)cv2.ellipse(),返回值其實(shí)就是旋轉(zhuǎn)邊界矩形的內(nèi)切圓。

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

      2.10直線擬合
      可以根據(jù)一組點(diǎn)擬合出一條直線,同樣我們也可以為圖像中的白色點(diǎn)擬合出一條直線。

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

      cv2.drawContours怎么使用

      到此,相信大家對(duì)“cv2.drawContours怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


      本文題目:cv2.drawContours怎么使用
      本文網(wǎng)址:http://ef60e0e.cn/article/jopjhj.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        邯郸市| 南丹县| 神池县| 韶山市| 大石桥市| 阳谷县| 呼和浩特市| 平利县| 潜江市| 黄大仙区| 亚东县| 绥滨县| 沂南县| 会东县| 石林| 阿克陶县| 美姑县| 永修县| 石泉县| 南康市| 工布江达县| 惠州市| 武山县| 安溪县| 九寨沟县| 赤水市| 镇沅| 思茅市| 会昌县| 宁德市| 璧山县| 商南县| 嵩明县| 淮安市| 固阳县| 临高县| 余江县| 屏南县| 永嘉县| 水富县| 郸城县|