将缓冲图像转换为 Mat 后圆检测失败
circle detection fail after convert buffered image to Mat
我是 opencv 的新手并使用 opencv3
。我正在尝试使用霍夫变换检测圆。我有 this code which read image from a file and detect circles then write it to a file.this works fine .here is the original image and here is the detected 个。
但我想检测缓冲图像中的圆圈。所以我使用了一种方法将缓冲图像转换为 Mat 对象。然后发生的事情是圆圈检测失败并且图像已调整大小。亮度也降低了 much.this 是 failed one.
这是我用来将缓冲图像转换为 mat 的代码(取自 Whosebug 答案)
public Mat bufferedImageToMat(BufferedImage bi) {
byte[] pixels = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(bi.getWidth(), bi.getHeight(), CvType.CV_8UC3);
mat.put(0, 0, pixels);
return mat;
}
我认为问题出在上面的方法中。
这是代码行 47
和 48
.
Mat source = Imgcodecs.imread(circleimage, Imgcodecs.CV_LOAD_IMAGE_COLOR);
//Mat source = bufferedImageToMat(bi);
如果我使用第一个(直接从图像中读取)代码有效。但是如果我使用第二个圆检测失败。
你能看出这个方法有问题吗?谢谢
在OpenCV中,图像由矩阵表示,其构造函数在columns
之前使用rows
个数,所以你应该使用
Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3);
如果您想了解更多,我已在 OpenCV Point(x,y) represent (column,row) or (row,column) 中尝试解释原因。
我是 opencv 的新手并使用 opencv3
。我正在尝试使用霍夫变换检测圆。我有 this code which read image from a file and detect circles then write it to a file.this works fine .here is the original image and here is the detected 个。
但我想检测缓冲图像中的圆圈。所以我使用了一种方法将缓冲图像转换为 Mat 对象。然后发生的事情是圆圈检测失败并且图像已调整大小。亮度也降低了 much.this 是 failed one.
这是我用来将缓冲图像转换为 mat 的代码(取自 Whosebug 答案)
public Mat bufferedImageToMat(BufferedImage bi) {
byte[] pixels = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(bi.getWidth(), bi.getHeight(), CvType.CV_8UC3);
mat.put(0, 0, pixels);
return mat;
}
我认为问题出在上面的方法中。
这是代码行 47
和 48
.
Mat source = Imgcodecs.imread(circleimage, Imgcodecs.CV_LOAD_IMAGE_COLOR);
//Mat source = bufferedImageToMat(bi);
如果我使用第一个(直接从图像中读取)代码有效。但是如果我使用第二个圆检测失败。
你能看出这个方法有问题吗?谢谢
在OpenCV中,图像由矩阵表示,其构造函数在columns
之前使用rows
个数,所以你应该使用
Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3);
如果您想了解更多,我已在 OpenCV Point(x,y) represent (column,row) or (row,column) 中尝试解释原因。