2017-01-05 3 views
0

나는 인터넷에서 opencv 2.x java 코드 예제를 찾을 수 있습니다. 나는 opencv 3.2를 사용하여 이미지를로드하고 x amout보다 긴 모든 검정색 선을 흰색으로 바꾼다. 여기가 무릎의 OpenCV의 2.4 버전 변형 예로 시작에서 어디에 있어요이미지 처리 opencv 3.0 어설 션 실패 오류

Mat img = Imgcodecs.imread("C:/Users/user1/Desktop/topdown-6.jpg"); 
    // Mat img = Imgcodecs.imread(fileName) 

    // generate gray scale and blur 
    Mat gray = new Mat(); 
    Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY); 
    Imgproc.blur(gray, gray, new Size(3, 3)); 

    // detect the edges 
    Mat edges = new Mat(); 
    int lowThreshold = 50; 
    int ratio = 3; 
    Imgproc.Canny(gray, edges, lowThreshold, lowThreshold * ratio); 

    Mat lines = new Mat(); 
    Imgproc.HoughLinesP(edges, lines, 1, Math.PI/180, 50, 50, 10); 

    for(int i = 0; i < lines.cols(); i++) { 
     double[] val = lines.get(0, i); 
     Imgproc.line(img, new Point(val[0], val[1]), new Point(val[2], val[3]), new Scalar(0, 0, 255), 2); 
    } 

    Image edgesImg = toBufferedImage(edges); 
    Image linesImg = toBufferedImage(lines); 
    Image imgg = toBufferedImage(img); 

... 내가 오류를

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file 

C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp, line 9748 
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp:9748: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor 
] 
    at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method) 
    at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:1778) 
    at Main.main(Main.java:174) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

내 목표는 것으로 어떤 도움을 받고 있어요 굉장해. 그냥 opencv 버전 2.x를 사용해야합니까?

편집 :

public Image toBufferedImage(Mat m){ 
    int type = BufferedImage.TYPE_BYTE_GRAY; 
    if (m.channels() > 1) { 
     type = BufferedImage.TYPE_3BYTE_BGR; 
    } 
    int bufferSize = m.channels()*m.cols()*m.rows(); 
    byte [] b = new byte[bufferSize]; 
    m.get(0,0,b); // ERROR HAPPENING HERE 
    BufferedImage image = new BufferedImage(m.cols(),m.rows(), type); 
    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); 
    System.arraycopy(b, 0, targetPixels, 0, b.length); 
    return image; 
} 

답변

1

문제는 나중에 변환 할 필요가 없습니다 있도록, 그레이 스케일로 이미지를로드하는 것입니다. cvtColor는 BGR2GRAY를 수행 할 때 입력 매트가 색상 매트가 될 것으로 예상합니다.

+0

제거 된 매개 변수. 동일한 오류 – Boutin

+0

매개 변수를 그대로두고 cvtColor 행을 제거하면 어떻게됩니까? (또한 입력으로 img를 사용하여 흐리게 변경) – brad

+1

나는 그것을 작동 시켰어. 해결책은 Imgcodecs.IMREAD_COLOR 매개 변수를 만드는 것이 었습니다. 이제 매트를 버퍼링 된 이미지로 변환하는 코드에서 "매트 데이터 유형이 호환되지 않습니다 : 28"오류가 발생합니다. toBufferedImage (mat)에 대한 편집되고 게시 된 코드; – Boutin