2017-10-15 95 views
0

以下のコードでは、オブジェクトの色が緑で輪郭を描いているかどうかを調べました。その情報を使って、シェイプのコーナーを見つけて切り抜きたいと思いますが、コードで使用していないConvexHull関数に関するエラーが発生します。私は私が書いたコードは私にこのエラーが発生します3.2.0cv2.minAreaRectでエラーが発生しました。私が使用していない凸包関数に関連したエラーを返します。

のpython 3とOpenCVのを使用している

ここ
Traceback (most recent call last): 
    File "/home/pi/Desktop/SelfDrivingCar/code/picamsense2.py", line 29, in <module> 
    points = cv2.minAreaRect(contour) 
error: /home/pi/opencv/opencv-3.2.0/modules/imgproc/src/convhull.cpp:136: error: (-215) total >= 0 && (depth == CV_32F || depth == CV_32S) in function convexHull 

は、私が探ししようとしている

from picamera import PiCamera 
import time 
import cv2 
import numpy as np  
camera = PiCamera() 
camera.start_preview() 
time.sleep(5) 
camera.capture('/home/pi/Desktop/piImage/image.jpg') 
camera.stop_preview() 
img = cv2.imread('/home/pi/Desktop/piImage/image.jpg', 1) 
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower = np.array([46, 100, 100]) 
upper = np.array([86, 255, 255]) 
mask = cv2.inRange (hsv, lower, upper) 
blur = cv2.GaussianBlur(mask, (7,5),0) 
erosion =cv2.erode(blur, (5,5), iterations = 3) 
contour =np.array(cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[1]) 
cv2.drawContours(img, contour, -1, (0,255,0), 3) 
for cnt in contour: 
    approx = cv2.approxPolyDP(cnt, 0.04*cv2.arcLength(cnt, True), True) 
    if len (approx)== 3: 
        print "triangle" 
    elif len (approx) == 4 : 
        print "quadrilateral" 
    elif len(approx) > 4: 
        print "circle"         
points = cv2.minAreaRect(contour) 
points = cv2.boxPoints(points) 
points = np.int0(points) 
for p in points : 
    pt = (p[0],p[1]) 
    print pt 
print points 
cv2.imshow('eroded', blur) 
cv2.imshow('original', img) 
while (1): 
    k = cv2.waitKey(0) 
    if(k == 27): 
     break 
cv2.destroyAllWindows() 

私のコードです今

すべてのヘルプは

おかげでいただければ幸い静かないくつかの時間を修正

-SAM

+0

"rotatedRect"は、おそらく凸包コードとともに実装された_rotating caliper_アルゴリズムを使用します。 1)空ベクトルをrotateRectに渡していないこと、そしてベクトルがint(CV_32S)またはfloat(CV_32F)であることを確認してください。また、ポイント(等高線)の配列の配列を渡すべきではなく、ポイントの配列(cntのような) – Miki

答えて

0

を進めるあなたが作っている間違いは、あなたが輪郭を期待する関数への等高線の配列を渡しているということです。

ここにイラストのコードがあります。輪郭配列内のすべての別々の輪郭の境界ボックスを計算し、それらをリストに格納します。

rectangles = [] 
for cont in contour: 
    rectangles.append(cv2.minAreaRect(cont)) 
+0

ありがとう人は私をたくさん助けました – Sam

+0

クールだが、あなたは私の答えを選択することによって答えとしてマークする必要があります。 – openTankist