OpenCV C++中的视差图代码

3

我用Caltech的工具箱(http://www.vision.caltech.edu/bouguetj/calib_doc/)在MATLAB中校准和立体矫正了图像。我尝试在MATLAB中使用disaprity,但是它现在没有返回良好的结果,所以我想在OPENCV中尝试一下。我在他们的网站上找不到任何有关disparity的OPENCV示例代码。因此,这是我目前找到的代码:(代码来自http://www.jayrambhia.com/blog/disparity-maps/

#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/contrib/contrib.hpp"
#include <stdio.h>
#include <string.h>
using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
Mat img1, img2, g1, g2;
Mat disp, disp8;

//char* method = argv[3];
char* method = "SGBM";

//img1 = imread(argv[1]);
//img2 = imread(argv[2]);
img1 = imread("leftImage.jpg");
img2 = imread("rightImage.jpg");

cvtColor(img1, g1, CV_BGR2GRAY);
cvtColor(img2, g2, CV_BGR2GRAY);

if (!(strcmp(method, "BM")))
{
    StereoBM sbm;
    sbm.state->SADWindowSize = 9;
    sbm.state->numberOfDisparities = 112;
    sbm.state->preFilterSize = 5;
    sbm.state->preFilterCap = 61;
    sbm.state->minDisparity = -39;
    sbm.state->textureThreshold = 507;
    sbm.state->uniquenessRatio = 0;
    sbm.state->speckleWindowSize = 0;
    sbm.state->speckleRange = 8;
    sbm.state->disp12MaxDiff = 1;
    sbm(g1, g2, disp);
}
else if (!(strcmp(method, "SGBM")))
{
    StereoSGBM sbm;
    sbm.SADWindowSize = 3;
    sbm.numberOfDisparities = 144;
    sbm.preFilterCap = 63;
    sbm.minDisparity = -39;
    sbm.uniquenessRatio = 10;
    sbm.speckleWindowSize = 100;
    sbm.speckleRange = 32;
    sbm.disp12MaxDiff = 1;
    sbm.fullDP = false;
    sbm.P1 = 216;
    sbm.P2 = 864;
    sbm(g1, g2, disp);
}


normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);

imshow("left", img1);
imshow("right", img2);
imshow("disp", disp8);

waitKey(0);

return(0);

这是我收到的错误信息:

在OPEN_CV_TEST.exe中,位于0x000007FEFD4D940D处未处理的异常:Microsoft C++ exception: cv::Exception,内存位置为0x0000000000149260。

我对C ++还很陌生,并且没有关于运行代码的过程说明。因此,我只将左右图像放入我的项目的\ x64 \ Debug 文件夹中,并在MS Visual Studio 2012 Windows 7 64位上运行代码。我之前创建了该项目并运行了一个示例测试,它可以正常工作。所以现在我只是将上述代码复制到主C ++源文件中。我认为不应该缺少任何库文件或头文件。

请注意,我现在不需要校正图像,也不需要进行立体匹配。

非常感谢您的帮助。


只是为了明确起见,我从opencv官网上找到了这个立体匹配的代码(https://github.com/Itseez/opencv/blob/master/samples/cpp/stereo_match.cpp),但是由于我没有相机校准文件,所以无法使用这段代码。 - undefined
你是否提供了所有必要的 DLL 文件?我在没有将 DLL 文件与可执行文件放在一起(或者没有将它们放在 PATH 环境变量中)时遇到了类似的异常。 - undefined
是的。我将所有的DLL文件复制到了项目的\x64\Debug文件夹旁边。我认为问题可能出在如何运行代码上。因为我在main函数开头加入了以下内容:if( argc != 4) { std::cout <<" 需要3个参数,2个要显示的图像和一个方法" << endl; return -1; }现在它以错误码-1退出。 这是否意味着我没有正确地运行代码? - undefined
1个回答

1
我找到问题所在了!是OPENCV中的"imread"函数引起了问题!我改用了"cvLoadImage"。我还把图片放在了项目文件夹旁边的CPP文件和DEBUG文件夹中。现在一切都正常了。显然,"IMREAD"函数在OPENCV中是一个已知的问题!

2
使用过时的cvLoadImage而不是新的imread不能被视为一个有效的解决方案... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接