2017-01-05 5 views
0

Alles, was ich im Internet finden kann, ist OpenCV 2.x Java-Code Beispiele. Ich benutze opencv 3.2 und versuche, ein Bild zu laden und alle schwarzen Linien, die länger als x Pixel sind, weiß zu machen (entferne sie). Hier ist, wo ich bei einer Temperatur von beginnend mit einer opencv 2.4 Version eines hough bin verwandeln Beispiel ...Bildverarbeitung opencv 3.0 Assertion fehlgeschlagen Fehler

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); 

Und ich erhalte den Fehler

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) 

Jede Hilfe zu meinem Ziel wäre es, genial. Sollte ich nur opencv Version 2.x verwenden?

Edit:

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; 
} 

Antwort

1

Das Problem ist, dass Sie das Bild als Graustufen laden, so dass Sie es später nicht zu konvertieren. cvtColor erwartet, dass die Eingabematte in Ihrem Fall eine Farbmatte ist, wenn der Parameter BGR2GRAY

+0

entfernt wird. selbe Fehler – Boutin

+0

Was passiert, wenn Sie den Parameter verlassen und die cvtColor-Zeile entfernen? (Auch Unschärfe zu ändern, um img als Eingabe zu verwenden) – brad

+1

ich habe es funktioniert. Lösung war, den Parameter Imgcodecs.IMREAD_COLOR zu machen. Jetzt bekomme ich einen "Mat-Datentyp ist nicht kompatibel: 28" -Fehler im Code, der die Matte in ein gepuffertes Bild verwandelt. bearbeiteter und veröffentlichter Code für toBufferedImage (Matte); – Boutin

Verwandte Themen