2013-07-11 4 views
4

제발 도와주세요,자바 안드로이드 Opencv 2.3

안드로이드에서 볼록 헐에 문제가 있습니다. Java 및 OpenCV 2.3을 사용합니다. 나는 자바를 만든 전에

, 나는 비주얼 스튜디오 2008

이 코드는 C에서 성공적으로 실행 할 수 있습니다 ++와 C++에 그것을했다.

이제 C++에서 Android 용 Java로 변환하고 싶습니다. 그리고 SDK Android Android 시뮬레이터에서 실행할 때 "강제 종료"와 같은 오류가 발견되었습니다.

이것은 ++ C에 내 코드입니다 :

vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 

findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
drawing = Mat::zeros(canny_output.size(), CV_64F); 

/// Find the convex hull object for each contour 
vector<vector<Point> > hull (contours.size()); 
for(int i = 0; i < contours.size(); i++) 
    { convexHull(Mat(contours[i]), hull[i], false); 
} 

for(size_t i = 0; i < contours.size(); i++){ 
    drawContours(drawing, hull, i, Scalar(255, 255, 255), CV_FILLED); // FILL WHITE COLOR 
} 

그리고 이것은 안드로이드에 내 코드입니다 : 귀하의 정보에 대한

Mat hierarchy = new Mat(img_canny.rows(),img_canny.cols(),CvType.CV_8UC1,new Scalar(0)); 
    List<Mat> contours =new ArrayList<Mat>(); 
    List<Mat> hull = new ArrayList<Mat>(contours.size()); 
    drawing = Mat.zeros(img_canny.size(), im_gray); 

    Imgproc.findContours(img_dilasi, contours, hierarchy,Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); 

    for(int i=0; i<contours.size(); i++){ 
     Imgproc.convexHull(contours.get(i), hull.get(i), false); 

    } 
    for(int i=0; i<contours.size(); i++){ 
     Imgproc.drawContours(drawing, hull, i, new Scalar(255.0, 255.0, 255.0), 5); 
    } 

, 나는 내 코드에서 볼록 선체에 약간 수정을했다. 윤곽선 내부에 색상을 기입합니다.

누구든지 내 문제를 해결할 수 있습니까?

귀하의 도움에 매우 감사드립니다.

+0

문제의 원인을 파악하기가 어렵습니다. 어떤 오류가 발생합니까? 거기에 관련된 로그 출력이 있습니까? – Aurelius

+0

SDK Android 시뮬레이터에서 실행할 때 "응용 프로그램이 예기치 않게 중지되었습니다"라는 Windows 오류가 나타나고 "강제 종료"를 클릭하여 중지해야한다고 들었습니다. Log Cat error Eclipse에서이 줄에서 "Imgproc.convexHull (contours.get (i), hull.get (i), false);" 프로세스가 그 행에서 중지 된 이유를 알 수 없습니다. 나에게 설명 할 수 없습니까? – Jenang

+0

"선체"변수를 선언 할 때 실수를 저질렀다고 생각합니다. 하지만 그 문제를 해결하는 방법을 모르겠습니다. 나는 해당 조항에 따라 그 변수를 선언했다고 생각합니다. 귀하의 의견은 어떻습니까? 코드에서 "hull"변수의 선언이 올바르지 않다고 생각하십니까? – Jenang

답변

1

findContours()convexHull()의 문서를 보면 변수 contourshull이 잘못 선언 된 것처럼 보입니다. 에 선언을 변경

봅니다 : 당신이 convexHull()를 호출 한 후

List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
List<MatOfInt> hull = new ArrayList<MatOfInt>(); 

그런 다음, hull인덱스를 볼록 선체를 구성 contours의 포인트이 포함되어 있습니다. drawContours()으로 점을 그리려면 convex wull의 점만 포함하는 새 MatOfPoint을 채우고 drawContours()으로 전달해야합니다. 나는 이것을 당신을위한 운동으로 남겨 둡니다.

1

이 C에서, 아우 렐리 우스는 말에 추가하려면 ++ 구현하면 포인트의 벡터를 사용하므로 선체 행렬은 실제 볼록 포인트가 포함되어

"첫 번째 경우를 [인덱스의 정수 벡터] , 선체 요소는 원래 배열의 convex hull 점의 0부터 시작하는 인덱스입니다 (convex hull 점 집합은 원점 집합의 부분 집합이기 때문에). 두 번째 경우 [점의 벡터]에서는 hull 요소가 볼록 선체 자체를 가리 킵니다. " - convexHull

당신이 당신의 안드로이드 버전

drawContours(drawing, hull, i, Scalar(255, 255, 255), CV_FILLED); 

를 호출 할 수 있었던 이유는, 선체 출력은 원래 contours.get의 점에 해당 인덱스의 배열 (내가 단순히) 매트릭스. 따라서 원래 행렬에서 볼록 점을 찾아야합니다.

MatOfInt hull = new MatOfInt(); 
MatOfPoint tempContour = contours.get(i); 
Imgproc.convexHull(tempContour, hull, false); // O(N*Log(N)) 
//System.out.println("hull size: " + hull.size() + " x" + hull.get(0,0).length); 
//System.out.println("Contour matrix size: " + tempContour.size() + " x" + tempContour.get(0,0).length); 

int index = (int) hull.get(((int) hull.size().height)-1, 0)[0]; 
Point pt, pt0 = new Point(tempContour.get(index, 0)[0], tempContour.get(index, 0)[1]); 
for(int j = 0; j < hull.size().height -1 ; j++){ 
    index = (int) hull.get(j, 0)[0]; 
    pt = new Point(tempContour.get(index, 0)[0], tempContour.get(index, 0)[1]); 
    Core.line(frame, pt0, pt, new Scalar(255, 0, 100), 8); 
    pt0 = pt; 
} 
10

나 Imgproc.convexHull을 (도왔 위, 그냥이 같은 내 사용 사례에 대한 작업) 두 개의 답을 말하고 싶었다 댓글을 추가 할 수있는 담당자가 없습니까 (: 여기에 매우 거친 생각입니다 2.4.8) :

MatOfPoint mopIn = ... 
MatOfInt hull = new MatOfInt(); 
Imgproc.convexHull(mopIn, hull, false); 

MatOfPoint mopOut = new MatOfPoint(); 
mopOut.create((int)hull.size().height,1,CvType.CV_32SC2); 

for(int i = 0; i < hull.size().height ; i++) 
{ 
    int index = (int)hull.get(i, 0)[0]; 
    double[] point = new double[] { 
     mopIn.get(index, 0)[0], mopIn.get(index, 0)[1] 
    }; 
    mopOut.put(i, 0, point); 
}   
// do something interesting with mopOut 
1

이 코드는 내 응용 프로그램에서 잘 작동합니다. 필자의 경우 여러 윤곽을 가지고 작업했기 때문에 목록이 많았지 만 한 윤곽 만 있으면 .get (i) 반복없이 작업하도록 조정하십시오.

이 스레드는 프로세스를보다 간단하게 설명합니다. convexHull 방법에 의해 식별

android java opencv 2.4 convexhull convexdefect

자바
// Find the convex hull 
      List<MatOfInt> hull = new ArrayList<MatOfInt>(); 
      for(int i=0; i < contours.size(); i++){ 
       hull.add(new MatOfInt()); 
      } 
      for(int i=0; i < contours.size(); i++){ 
       Imgproc.convexHull(contours.get(i), hull.get(i)); 
      } 

      // Convert MatOfInt to MatOfPoint for drawing convex hull 

      // Loop over all contours 
      List<Point[]> hullpoints = new ArrayList<Point[]>(); 
      for(int i=0; i < hull.size(); i++){ 
       Point[] points = new Point[hull.get(i).rows()]; 

       // Loop over all points that need to be hulled in current contour 
       for(int j=0; j < hull.get(i).rows(); j++){ 
        int index = (int)hull.get(i).get(j, 0)[0]; 
        points[j] = new Point(contours.get(i).get(index, 0)[0], contours.get(i).get(index, 0)[1]); 
       } 

       hullpoints.add(points); 
      } 

      // Convert Point arrays into MatOfPoint 
      List<MatOfPoint> hullmop = new ArrayList<MatOfPoint>(); 
      for(int i=0; i < hullpoints.size(); i++){ 
       MatOfPoint mop = new MatOfPoint(); 
       mop.fromArray(hullpoints.get(i)); 
       hullmop.add(mop); 
      } 


      // Draw contours + hull results 
      Mat overlay = new Mat(binaryImage.size(), CvType.CV_8UC3); 
      Scalar color = new Scalar(0, 255, 0); // Green 
      for(int i=0; i < contours.size(); i++){ 
       Imgproc.drawContours(overlay, contours, i, color); 
       Imgproc.drawContours(overlay, hullmop, i, color); 
      } 
1

예 (OpenCV의 2.4.11)는

hullMat, gray의 서브 매트를 포함한다.
실제로 필요한 윤곽을 필터링 할 수 있습니다 (예 : 해당 영역을 기준으로).

List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
MatOfInt4 hierarchy = new MatOfInt4(); 
MatOfInt hull = new MatOfInt(); 

void foo(Mat gray) { 
    Imgproc.findContours(gray, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);   
    for (int i = 0; i < contours.size(); i++) { 
     Imgproc.convexHull(contours.get(i), hull); 
     MatOfPoint hullContour = hull2Points(hull, contours.get(i)); 
     Rect box = Imgproc.boundingRect(hullContour); 
     Mat hullMat = new Mat(gray, box); 
     ... 
    } 
} 

MatOfPoint hull2Points(MatOfInt hull, MatOfPoint contour) { 
    List<Integer> indexes = hull.toList(); 
    List<Point> points = new ArrayList<>(); 
    MatOfPoint point= new MatOfPoint(); 
    for(Integer index:indexes) { 
     points.add(contour.toList().get(index)); 
    } 
    point.fromList(points); 
    return point; 
} 
관련 문제