2017-09-21 10 views
0

간단한 기하학적 모양을 감지하는 Java 응용 프로그램을 프로그래밍하고 있습니다.OpenCV [Java]를 사용하여 간단한 기하학적 모양 검출

다음 파이썬 코드가 기준으로 사용됩니다 How to detect simple geometric shapes using OpenCV

이 코드의 일부는 [파이썬]입니다 :

contours,h = cv2.findContours(thresholdedImage,1,2) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True) 
    print len(approx) 
    if len(approx)==5: 
     print "pentagon" 
     cv2.drawContours(img,[cnt],0,255,-1) 
    elif len(approx)==3: 
     print "triangle" 
     cv2.drawContours(img,[cnt],0,(0,255,0),-1) 
    elif len(approx)==4: 
     print "square" 
     cv2.drawContours(img,[cnt],0,(0,0,255),-1) 
    elif len(approx) == 9: 
     print "half-circle" 
     cv2.drawContours(img,[cnt],0,(255,255,0),-1) 
    elif len(approx) > 15: 
     print "circle" 
     cv2.drawContours(img,[cnt],0,(0,255,255),-1) 

자바의 OpenCV의 방법을 사용하여, 나는 "은을 추출 할 수 없어요 len "(길이) 속성 (어떤 모양이 감지되었는지 확인하기 위해) 대략적인 윤곽선입니다.

윤곽의 몇 [자바] 생산하고 밖으로 인쇄 :

[ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x23ac75f0, dataAddr=0x1c7c66c0 ] 
[ 5*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x23ac7200, dataAddr=0x1c0e5fc0 ] 
etc. 

내가 특정 윤곽 객체의 점의 수를 좀하고 싶습니다 - 위의 코드에서 45을.

문자열로 변환 한 다음 숫자를 추출 할 수 있다는 것을 알고 있지만 더 좋은 방법이 있어야합니다. 맞습니까?

답장을 보내 주셔서 감사합니다.

+0

'len'은 단순히'approx' 배열에있는 원소의 수를 얻는 것입니다. 점/선 또는 기타의 '길이'를 계산하지 않습니다. Java에서'.length'와 같습니다. 그래서 그것은 단지 "삼각형이 삼각형이고, 삼각형이 다섯 개인 경우"라고 말하는 것입니다. –

답변

1

트릭을해야합니다. (이미 yourImageMatOfPoint2f 개체에 저장되어 있다고 가정).

MatOfPoint2f approx = new MatOfPoint2f(); 
Imgproc.approxPolyDP(yourImage, approx, Imgproc.arcLength(yourImage, true) * 0.02, true); 
long count = approx.total(); 
if (count == 5) { 
    // this is a pentagon 
} 

확인 this 파이썬이나 C++와 같은 다른 언어에 비해 조금 까다로운 자바 total()

에서 OpenCV의 사용된다 볼 수 있습니다.

+0

감사합니다. 이로 인해 문제가 해결되었습니다. – user2426320