我看过很多关于这个问题的帖子,但这个帖子有所不同。我的代码适用于一对图像但不适用于另一对图像。
稍后,我想将两个摄像头的视频输入转换为立体声输出。我试过了,但也有与下面显示的图像(第二对图像)相同的问题。
以下图片显示预期输出
以下图片显示输出错误
如何更正我的代码以使其适用于所有图像?
这是我的代码
public static void main(String[] args)
{
Mat left = Imgcodecs.imread("path", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat right = Imgcodecs.imread("path", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Core.normalize(left, left, 0, 255, NORM_MINMAX, CvType.CV_8U);
Core.normalize(right, right, 0, 255, NORM_MINMAX, CvType.CV_8U);
StereoBM bm = StereoBM.create(16, 15);
Mat disparity = new Mat();
bm.compute(left, right, disparity);
ImageProcessor.showResult(disparity);
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void showResult(Mat img)
{
Imgproc.resize(img, img, new Size(640, 480));
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", img, matOfByte);
byte[] byteArray = matOfByte.toArray();
BufferedImage buffImage = null;
try
{
InputStream in = new ByteArrayInputStream(byteArray);
buffImage = ImageIO.read(in);
JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(buffImage)));
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
} catch (IOException e)
{
e.printStackTrace();
}
}
答案 0 :(得分:0)
在标准化后以灰度级查看两个图像 - 正如您的算法所看到的那样。至少,我会从那开始。
需要灰色图像并检测边框。由于所有都是标准化的,因此可能更好地看到来自背景的边界与真实对象中的边界。
要解决此问题,您可以使用background subtraction之类的其他算法。希望有所帮助。
答案 1 :(得分:0)
StereoBM计算两个图像之间的相关性。在第二对中,您可以在墙上看到图案 - 这可能会导致问题(与其他图案元素更好地相关)。如您所见,您的植物保持黑色(最远的元素,相应点之间的距离最小)。 在数字图像相关中,图像中的强度随机分布越多,结果越好。为了增加强度分布的随机性,对对象添加了特殊随机模式进行了大量研究。
您可以通过添加最大距离约束或使用基于距离的功能修改图像来解决该问题。作为该函数的原点,您可以使用点,其具有彼此最接近的两个相关点。然后你可以进行第二次迭代。