2014-02-22 2 views
2

우리는 C++ 코드를 Detection of coins (and fit ellipses) on an image에서 Java로 변환하려고했습니다. 우리는 매개 변수자바에서 OpenCV 타원 검출 문제

2 PathToThePicture 

는이 오류와 함께 충돌로 프로그램을 시작할 때 :

여기
OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file  
..\..\..\..\opencv\modules\core\src\array.cpp, line 1238 
Exception in thread "main" java.lang.RuntimeException: ..\..\..\..\opencv\modules  
\core\src\array.cpp:1238: error: (-5) Array should be CvMat or IplImage in function 
cvGetSize 

at com.googlecode.javacv.cpp.opencv_core.cvGetSize(Native Method) 
at DetectEllipse.main(DetectEllipse.java:65) 

변환 된 자바 코드이다 :

import static com.googlecode.javacv.cpp.opencv_core.CV_FILLED; 
import static com.googlecode.javacv.cpp.opencv_core.CV_RGB; 
import static com.googlecode.javacv.cpp.opencv_core.CV_WHOLE_SEQ; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateMemStorage; 
import static com.googlecode.javacv.cpp.opencv_core.cvDrawContours; 
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize; 
import static com.googlecode.javacv.cpp.opencv_core.cvPoint; 
import static com.googlecode.javacv.cpp.opencv_core.cvScalar; 
import static com.googlecode.javacv.cpp.opencv_core.cvXorS; 
import static com.googlecode.javacv.cpp.opencv_core.cvZero; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_CHAIN_APPROX_SIMPLE; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_RETR_CCOMP; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvContourArea; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvDilate; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvFindContours; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvThreshold; 

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.cpp.opencv_core.CvContour; 
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage; 
import com.googlecode.javacv.cpp.opencv_core.CvRect; 
import com.googlecode.javacv.cpp.opencv_core.CvScalar; 
import com.googlecode.javacv.cpp.opencv_core.CvSeq; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 

public class DetectEllipse{ 

    public static final double M_PI = 3.14159265358979323846; 
    public static final double MIN_AREA = 100.00; 
    public static final double MAX_TOL = 100.00; 

    private static int[] array = { 0 }; 
    // 
    // We need this to be high enough to get rid of things that are too small 
    // too 
    // have a definite shape. Otherwise, they will end up as ellipse false 
    // positives. 
    // 
    // 
    // One way to tell if an object is an ellipse is to look at the relationship 
    // of its area to its dimensions. If its actual occupied area can be 
    // estimated 
    // using the well-known area formula Area = PI*A*B, then it has a good 
    // chance of 
    // being an ellipse. 
    // 
    // This value is the maximum permissible error between actual and estimated 
    // area. 
    // 

    public static void main(String[] args) { 
     IplImage src = cvLoadImage(args[1], 0); 
     // the first command line parameter must be file name of binary 
     // (black-n-white) image 
     if (Integer.parseInt(args[0]) == 2) { 
      IplImage dst = cvCreateImage(cvGetSize(src), 8, 3); 
      CvMemStorage storage = cvCreateMemStorage(0); 
      CvSeq contour = new CvContour(); 
      // maybe: = new CvSeq(0) 
      cvThreshold(src, src, 1, 255, CV_THRESH_BINARY); 
      // 
      // Invert the image such that white is foreground, black is 
      // background. 
      // Dilate to get rid of noise. 
      // 
      cvXorS(src, cvScalar(255, 0, 0, 0), src, null); 
      cvDilate(src, src, null, 2); 

      cvFindContours(src, storage, contour, 
        Loader.sizeof(CvContour.class), CV_RETR_CCOMP, 
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); 
      cvZero(dst); 

      for (; contour.flags() != 0; contour = contour.h_next()) { 
       // if not working: use contour.isNull() 
       double actual_area = Math.abs(cvContourArea(contour, 
         CV_WHOLE_SEQ, 0)); 
       if (actual_area < MIN_AREA) 
        continue; 

       // 
       // FIXME: 
       // Assuming the axes of the ellipse are vertical/perpendicular. 
       // 
       CvRect rect = ((CvContour) contour).rect(); 
       int A = rect.width()/2; 
       int B = rect.height()/2; 
       double estimated_area = Math.PI * A * B; 
       double error = Math.abs(actual_area - estimated_area); 
       if (error > MAX_TOL) 
        continue; 
       System.out.printf("center x: %d y: %d A: %d B: %d\n", rect.x() 
         + A, rect.y() + B, A, B); 

       CvScalar color = CV_RGB(
         tangible.RandomNumbers.nextNumber() % 255, 
         tangible.RandomNumbers.nextNumber() % 255, 
         tangible.RandomNumbers.nextNumber() % 255); 
       cvDrawContours(dst, contour, color, color, -1, CV_FILLED, 8, 
         cvPoint(0, 0)); 
      } 

      cvSaveImage("coins.png", dst, array); 
     } 
    } 

} 

수있는 사람의 도움을 사용? 미리 감사드립니다!

+0

오류 메시지에 따르면, 충돌은 코드 라인 (65)에서 발생합니다. 그게 어떤 선 이니? – karlphillip

+0

이 줄은 다음과 같습니다 : 'IplImage dst = cvCreateImage (cvGetSize (src), 8, 3); ' – Baschdl

답변

1

아마도 cvGetSize(src)이 충돌하고 있습니다. 이는 srcnull 일 때 발생합니다.

즉, 이미지가로드되지 않았거나 발견되지 않았습니다 (경로가 잘못되었을 수 있습니다). 이미지가 성공적으로로드 된 경우 향후

, 당신은 테스트를 통해 이러한 문제를 방지 할 수 있습니다

IplImage src = cvLoadImage(args[1], 0); 
if (src == null) 
{ 
    System.out.println("!!! Unable to load image: " + args[1]); 
    return; 
} 
+0

감사합니다. 이제 프로그램이 이미지를로드하지만 그 후 우리의 질문 편집에서 언급 한 오류가 발생합니다 . – Baschdl

+0

아 ...하지 마세요 :(이제는 질문을 완전히 변경했습니다. 코드에 문제가있어이 대답이 해결되었습니다! 질문을 변경하면 답변이 미래의 방문자에게는 쓸모 없게되고 투표를 거치게됩니다. 대답이 더 이상 의미가 없기 때문에, 새로운 문제를 해결하기 위해 기존 질문을 하이재킹하는 대신 ** 새로운 질문 **을해야합니다.해야 할 일이 있습니다 : 새로운 질문을하겠습니다. – karlphillip

+0

죄송합니다, stackoverflow를 처음 사용했습니다. 이것은 새로운 스레드입니다 : [치명적인 오류가 Java 런타임에 의해 감지되었습니다. 환경 : Java에서 OpenCV 타원 탐지] (http://stackoverflow.com/questions/21968038/fatal-error-has-been-detected-by-the-java-runtime-environment-opencv-ellipse-de) – Baschdl