2016-02-12 62 views
0

我是新来opencv并使用opencv3。我试图检测使用hough-transform的圆.i有this code,它从文件中读取图像并检测圆,然后将其写入一个file.this工作正常。这里是原始image,这里是detected之一。将缓冲后的图像转换为图像后圆检测失败

但我想检测缓冲图像中的圆圈。因此,我使用了一种方法将缓冲图像转换为Mat对象。然后发生了什么情况是圆检测失败,图像已调整大小,同时亮度减少太多。 failed one

这里为i用于缓冲的图像转换为垫的代码(来自计算器答案截取)

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

我认为问题是在上述方法中。这是代码行4748

Mat source = Imgcodecs.imread(circleimage, Imgcodecs.CV_LOAD_IMAGE_COLOR); 
//Mat source = bufferedImageToMat(bi); 

如果我使用第一个(直接从图像读取)代码工作。但如果我使用第二个圆检测失败。

你能看出这个方法有问题吗?感谢

+2

在C++语法中Mat构造函数按照不同的顺序使用参数:Mat(rows,cols,type)',这对java语法来说可能是一样的吗?请尝试'新的垫(bi.getHeight(),bi.getWidth(),CvType.CV_8UC3);' – Micka

+1

@Micka噢是的,你说得对.tnx你这么多.post它作为答案plz.it现在的作品 –

回答

1

在OpenCV中,图像是通过矩阵,它的构造函数使用的rowscolumns号之前表示的,所以你应该使用

Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3); 

我试图解释OpenCV Point(x,y) represent (column,row) or (row,column)的原因,如果你想更多地了解它。

+0

tnx你这么多 –

+1

这是一个非常好的答案。将其保存为重复项的目标:D – Miki