2017-10-15 1 views
0

아래 코드에서 객체의 색상이 녹색이고 주위에 윤곽선을 그려 냈습니다. 그 정보를 가지고도 모양 모서리를 찾고 자르기를 원하지만 코드에서 사용하지 않은 ConvexHull 함수와 관련된 오류가 발생합니다. 내가 작성한 코드는 날이 오류를 제공 3.2.0cv2.minAreaRect의 오류가 발생했습니다. 사용하지 않은 convex hull 함수와 관련된 오류가 발생합니다.

파이썬 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() 

내 코드입니다 잠시 조용하게 해결하십시오

도움이 되셨다면

감사합니다. 사전

- 샘

당신이 만들고있는 실수는 당신이 윤곽을 예상하는 기능에 윤곽의 배열을 전달하는 것입니다
+0

"rotatedRect"는 _rotating caliper_ 알고리즘을 사용합니다.이 알고리즘은 아마도 convex hull code와 함께 구현됩니다. 반드시 : 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

관련 문제