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;
}
entfernt wird. selbe Fehler – Boutin
Was passiert, wenn Sie den Parameter verlassen und die cvtColor-Zeile entfernen? (Auch Unschärfe zu ändern, um img als Eingabe zu verwenden) – brad
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