我正在玩open cv,我决定测试一下罗宾逊面具的教程example。我复制了代码并使用了灰度级的jpg
- 不幸的是,输出的图像是完全黑的。
我尝试评论出两个额外的方向滤波器。图像仍然是黑色的。
-I' m使用java 1.8和opencv 3
try{
int kernelSize = 9;
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
Mat source = Imgcodecs.imread("grayScale2.jpg", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(),source.cols(),source.type());
Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F){
{
put(0,0,-1);
put(0,1,0);
put(0,2,1);
put(1,0-2);
put(1,1,0);
put(1,2,2);
put(2,0,-1);
put(2,1,0);
put(2,2,1);
}
};
Imgproc.filter2D(source, destination, -1, kernel);
Imgcodecs.imwrite("robinsonMaskExample.jpg", destination);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
答案 0 :(得分:1)
您链接我们的代码有点缺陷。它将内核大小定义为9 x 9大小,但内核本身显然是3 x 3.因此,它将内核系数放在内核的左上角,其余的内核本身是这可能是你没有看到正确结果的原因。 put
方法将数字放在矩阵的行和列中。正如您在定义内核的代码中所看到的那样,它将内容放在行0,1,2和第0,1,2行中 - 这是隐式的3 x 3内核,但内核的大小是实际上是9 x 9。
因此,请取消注释您注释掉的那些行,因为正确定义整个边缘检测蒙版非常重要。此外,该帖子在使用的边缘检测掩码方面是错误的。那实际上是在使用Sobel operator。我从来没有听说过一个名为" Robinson"之前,但我听说过Roberts-Cross掩码,这是一个 2 x 2 内核,如下所示:
来源:Wikipedia
因此,最简单的解决方法是更改内核大小,使其成为3 ....所以只需更改此内容:
$results = array('Thing 1', 'Thing 2')
对此:
int kernelSize = 9;
更广泛的图片:
int kernelSize = 3;
这个故事的道德。在线查找教程,这将成为您的一课。不要相信所有这些信息,因为它们有时会向您提供错误的信息,例如您刚才使用错误的内核大小并且调用边缘检测器时出错的信息。我当然会将它们作为一个很好的起点,但是当谈到细节时,请始终调试已发布的代码,以确保他们打算写的内容实际上是生成的内容。