openCV C+中的视差图代码+;

openCV C+中的视差图代码+;,opencv,disparity-mapping,Opencv,Disparity Mapping,我使用加州理工学院的工具箱()在MATLAB中校准和立体校正了图像。我在MATLAB中尝试了这一缺陷,但没有得到很好的结果,现在我想在OPENCV中尝试。我在他们的网站上找不到任何OPENCV的差异示例代码。这就是我找到的代码:(代码来自) #包括“opencv2/core/core.hpp” #包括“opencv2/calib3d/calib3d.hpp” #包括 #包括 #包括“opencv2/contrib/contrib.hpp” #包括 #包括 使用名称空间cv; 使用名称空间std;

我使用加州理工学院的工具箱()在MATLAB中校准和立体校正了图像。我在MATLAB中尝试了这一缺陷,但没有得到很好的结果,现在我想在OPENCV中尝试。我在他们的网站上找不到任何OPENCV的差异示例代码。这就是我找到的代码:(代码来自)

#包括“opencv2/core/core.hpp”
#包括“opencv2/calib3d/calib3d.hpp”
#包括
#包括
#包括“opencv2/contrib/contrib.hpp”
#包括
#包括
使用名称空间cv;
使用名称空间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(“righimage.jpg”);
CVT颜色(img1、g1、CV_bgr2灰色);
CVT颜色(img2、g2、CV_bgr2灰色);
如果(!(strcmp(方法,“BM”))
{
立体bm-sbm;
sbm.state->sadWindowsSize=9;
sbm.state->NumberOfDistances=112;
sbm.state->preFilterSize=5;
sbm.state->preFilterCap=61;
sbm.state->minDisparity=-39;
sbm.state->textureThreshold=507;
sbm.state->uniquenessRatio=0;
sbm.state->windowsize=0;
sbm.状态->范围=8;
sbm.state->disp12MaxDiff=1;
sbm(g1、g2、disp);
}
否则,如果(!(strcmp(方法,“SGBM”))
{
立体gbm-sbm;
sbm.sadvownsize=3;
sbm.numberofdifferenties=144;
sbm.preFilterCap=63;
sbm.minDisparity=-39;
sbm.uniquenessRatio=10;
sbm.windowsize=100;
sbm.1范围=32;
sbm.disp12MaxDiff=1;
sbm.fullDP=假;
sbm.P1=216;
sbm.P2=864;
sbm(g1、g2、disp);
}
正常化(disp、disp8、0、255、CV_MINMAX、CV_8U);
imshow(“左”,img1);
imshow(“右”,img2);
imshow(“disp”,disp8);
等待键(0);
返回(0);
}

这就是我得到的错误:

< Open> CVX.Test.EXE中的0x000 000 F7FD440D中的强>未处理异常:微软C++异常:CV::内存位置0x000 000 000 0149260。< /强>

<>我是C++的新手,没有关于运行代码的说明。因此,我只是将这些左右图像放在项目的\x64\Debug文件夹中,并在MS visual studio 2012 windows 7 64位中运行代码。我之前创建了这个项目,并运行了一个示例测试,它成功了。所以现在我只是在主C++源文件中复制上面的代码。我假设不应该缺少任何库文件或头文件。 另外请注意,我不需要纠正图像,也不需要立体匹配现在。
非常感谢您的帮助。

我想出来了!是OPENCV中的“imread”函数导致了问题!我用了“cvLoadImage”来代替。我还将图像放在项目的文件夹中,就在CPP文件旁边,也放在调试文件夹中。它现在运转良好。显然,“IMREAD”函数是OPENCV中的一个已知问题

为了清楚起见,我在opencv网站()上找到了这段匹配的代码,但是我没有相机校准文件,所以我不能使用这段代码。你提供了所有必要的DLL吗?当我没有将DLL与可执行文件放在一起(或者没有将它们放在PATH环境变量中)时,我也有类似的异常?是的。我复制了项目的\x64\Debug文件夹旁边的所有DLL。我认为问题在于如何运行代码。因为我把它放在main的开头:如果(argc!=4){std::cout使用过时的
cvLoadImage
代替新的
imread
不能被认为是有效的解决方案。。。
#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);