2017-01-03 28 views
0
# import the necessary packages 
import decimal 
import imutils 
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

# load the image, convert it to grayscale, and blur it slightly 
image = cv2.imread("hand.jpg",0) 

# threshold the image, then perform a series of erosions + 
# dilations to remove any small regions of noise 
thresh = cv2.threshold(image, 45, 255, cv2.THRESH_BINARY)[1] 
thresh = cv2.erode(thresh, None, iterations=2) 
thresh = cv2.dilate(thresh, None, iterations=2) 

# find contours in thresholded image, then grab the largest one 
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, 
    cv2.CHAIN_APPROX_SIMPLE) 
cnts = cnts[0] if imutils.is_cv2() else cnts[1] 
c = max(cnts, key=cv2.contourArea) 
size = len(c); 

refer_point = (207,130) 

data = np.genfromtxt("data.txt", delimiter=',') 

X = data[:,][:,0] 

Y = data[:,][:,1] 

for i in range(0,size): 
    dist1= (((abs(207-X))**2)+((abs(130-Y))**2))**(1.0/2.0) 

dist3 = round(dist1,2) 
print dist3 

plt.plot([dist3]) 

plt.show() 

私は上記のコードを作成しています。コードは完全に実行されましたが、イメージの輪郭点は完全に間違っていました。私はグラフをプロットした後、このエラーを観察しました。この問題について私を助けてください。画像の輪郭を見つけるPython OpenCV

+1

このコードスニペットの入力イメージと出力は何ですか? – ZdaR

+0

画像ですので、コメント行に画像を添付することはできません。 –

+1

それからそれらをアップロードし、ここにリンクを提供してください – ZdaR

答えて

0

1)浸食と膨張のためにカーネルが指定されていない場合、画像は変更されません。カーネルで試してみてください。

kernel = np.ones((3,3),np.uint8) 
thresh = cv2.erode(thresh, kernel, iterations=1) 
thresh = cv2.dilate(thresh, kernel, iterations=1) 

2)cntsが見つかりました輪郭上の点((x、y)のタプル)を含みます。 sizeは、その輪郭上の点の数だけです。あなたはそれのサイズを取得し、ポイントを処理しないで、代わりにデータファイルを読んで全く別のものをプロットします。適切に輪郭を表示するには、findContours後に次の操作を試してください。

# Load the image in color 
image = cv2.imread("hand.jpg",cv2.IMREAD_COLOR) 
# Draw the contours 
cv2.drawContours(image, cnts, -1, (0,255,0), 3) 
# Show the image with the contours 
cv2.imshow("contours",image) 

そして、輪郭点を使用してデータファイルを関連付けるしてみてください。

関連する問題