2017-01-28 21 views
0

画像があり、交差線が少なくても4つのポリゴンが生成されています。私は各ポリゴンの面積を測定したい。私のスクリプトでは輪郭を作成しようとしており、おそらく間違った方法を使っています。私はあなたの現在のコードを使用して輪郭を抽出するために、任意のアドバイス... source image
OpenCVを使用して画像から輪郭を抽出する

import cv2 
 
import numpy as np 
 
import time 
 

 

 
# define range of color in HSV 
 
lower_red = np.array([150,135,160]) 
 
upper_red = np.array([180,250,200]) 
 
white_line = np.array([255,255,255]) 
 
red_line = np.array([0,0,255]) 
 

 

 

 
im = cv2.imread('laser.jpg') 
 
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
 
cv2.imshow('imgray', im) 
 
ret,thresh = cv2.threshold(imgray,127,255,0) 
 
cv2.imshow('thresh', thresh) 
 

 
# Remove some small noise if any. 
 
dilate = cv2.dilate(thresh,None) 
 
erode = cv2.erode(dilate,None) 
 
cv2.imshow('erode', erode) 
 

 

 
_, contours, hierarchy = cv2.findContours(erode,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
 
##for contour in contours: 
 
## if (cv2.contourArea(contour) > 50): 
 
##  print contours 
 
im2 = np.zeros((500,500,3), np.uint8) 
 
cv2.drawContours(im2,contours,0,(125,125,0),1) 
 
cv2.imshow('contours',im2) 
 

 

 
k = cv2.waitKey(0) 
 
if k == 27:   # wait for ESC key to exit 
 
    cv2.destroyAllWindows() 
 
elif k == ord('s'): # wait for 's' key to save and exit 
 
    cv2.imwrite('messigray.png',im2) 
 
    cv2.destroyAllWindows()

+0

は私の答えはあなたの問題を解決しました:

あなたはちょうどこのような何かを行うことができ、いくつかの輪郭を選択し、それらを描きたい場合は

? – iamnotgoogle

答えて

0

に感謝し、次の操作を行うことができます:

_,contours,heirarchy=cv2.findContours(erode,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
im2 = np.zeros((480,640,3), np.uint8) 
cv2.drawContours(im2,contours,-1,(125,125,0),1) 

(RETR_EXTERNALはを提供します使用してそれらの内部に作られた個々のパーツが除外されている場合は、外部パーツの境界のみを除外します。したがって、適切な階層を提供するRETR_TREEを使用して、内部境界を確認していることを知ってください)。 これを行うと画像の一部が除外されるので、間違ったサイズの空の配列im2を作成しました(これ以外の輪郭を描画するとエラーが発生します)。これは小さなミスです。

ここで間違った部分はcv2.drawContours(im2,contours,0,(125,125,0),1)です。ここで画像の輪郭の配列を与え、最初の輪郭だけを描くように指示します(0番目の要素によって)。ですから輪郭番号(0の代わりに1または2または3または4または...)を使用して輪郭を1つずつ描画または処理するか、最初に輪郭線を選択して次のように描画します:

cnt=contour[4] 
cv2.drawContours(im2,[cnt],0,(125,125,0),1) 

、またはこれまでの図のように、(0)の代わりに(-1)を指定してすべての輪郭線を描画してください。

cnt=[contour[2],contour[5],contour[9]] 
cv2.drawContours(im2,cnt,-1,(125,125,0),1) 
+0

ありがとう、Iamnotgoogle!あなたはdefenetally私の主要な問題を解決し、私は今さらに行くことができます。私の最終的な目標は、画像の中心にある4つの矩形のそれぞれの周りに輪郭を作成し、その領域を計算することです。あなたの入力後、私は画像を反転させなければならない(ネガを構築する)と、 "findContour"関数を適用しなければならないことがわかります。 – guslik

+0

@guslikあなたが探している正確な線については、基本的なfindcontoursの輪郭は依然として不明ですが、輪郭を見つける前に線形エッジを検出するフィルタを適用したり、必要な特定の図形をチェックしたりすることができます。どちらか、それはあなたが検出したい生成されたポリゴンを含む画像をopencvで列挙します。 (ポリゴンには線分が外れて何かをする必要があります)。もし何かを手伝ってもらえると私に教えてください – iamnotgoogle

+0

ありがとう、私は助けていただければ幸いです...イメージ上の等高線ポリゴンを見つけると、私はそのエリアの正確な価値を私に与えると思いました。私はこのアプローチがどれほど正確かはわかりませんが、試してみたかったのです。エリアの測定は主要な目標です。もし他のアプローチが適用可能であり、もっと簡単であれば、私は学ぶことができます... – guslik

関連する問題