C++ opencv立体视觉深度图,代码不起作用
我正在研究立体视觉深度图,我正在使用opencv库。我编写了一个程序来获取深度图。但当程序运行时,我得到了一个空的深度图框。有人能帮我吗,怎么了?代码如下所示C++ opencv立体视觉深度图,代码不起作用,c++,opencv,map,depth,C++,Opencv,Map,Depth,我正在研究立体视觉深度图,我正在使用opencv库。我编写了一个程序来获取深度图。但当程序运行时,我得到了一个空的深度图框。有人能帮我吗,怎么了?代码如下所示 #include <opencv/highgui.h> #include <opencv/cv.h> #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/contrib/contrib.hpp>
int main()
{
IplImage* img1 = cvLoadImage("/home/sezen/Masaüstü/imR.png");
IplImage* img2 = cvLoadImage("/home/sezen/Masaüstü/imL.png");
IplImage *rimage = cvCreateImage(
cvSize( img1->width, img1->height ), IPL_DEPTH_8U, 1 );
cvCvtColor( img1, rimage, CV_RGB2GRAY );
IplImage *limage = cvCreateImage(
cvSize( img2->width, img2->height ), IPL_DEPTH_8U, 1 );
cvCvtColor( img2, limage, CV_RGB2GRAY );
cvNamedWindow( "Right", CV_WINDOW_AUTOSIZE );
cvShowImage( "Right", rimage );
cvNamedWindow( "Left", CV_WINDOW_AUTOSIZE );
cvShowImage("Left", limage);
CvMat *matr = cvCreateMat(rimage->height,rimage->width,CV_8UC1 );
CvMat *matl = cvCreateMat(limage->height,limage->width,CV_8UC1 );
CvMat* disp = cvCreateMat(rimage->height,rimage->width,CV_16S);
CvMat* vdisp = cvCreateMat(rimage->height,rimage->width,CV_16S);
cvConvert( rimage, matr );
cvConvert( limage, matl );
CvStereoBMState *BMState = cvCreateStereoBMState();
assert(BMState != 0);
BMState->preFilterSize=21;
BMState->preFilterCap=31;
BMState->SADWindowSize=21;
BMState->minDisparity=0;
BMState->numberOfDisparities=128;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
cvFindStereoCorrespondenceBM( matr, matl, disp, BMState);
cvNormalize(disp, vdisp, 0, 255, CV_MINMAX);
cvShowImage("depthmap", vdisp);
cvWaitKey(0);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
IplImage*img1=cvLoadImage(“/home/sezen/Masaüstü/imR.png”);
IplImage*img2=cvLoadImage(“/home/sezen/Masaüstü/imL.png”);
IplImage*笠美=cvCreateImage(
cvSize(img1->宽度,img1->高度),IPL_深度_8U,1);
CVT颜色(img1、笠美、CV_rgb2灰色);
IplImage*limage=cvCreateImage(
cvSize(img2->宽度,img2->高度),IPL_深度_8U,1);
CVT颜色(img2、石灰、CV_rgb2灰色);
cvNamedWindow(“右”,CV_窗口_自动调整大小);
cvShowImage(“右”,笠美);
cvNamedWindow(“左”,CV_窗口_自动调整大小);
cvShowImage(“左”,limage);
CvMat*matr=cvCreateMat(笠美->高度,笠美->宽度,CV_8UC1);
CvMat*matl=cvCreateMat(limage->height,limage->width,CV_8UC1);
CvMat*disp=cvCreateMat(笠美->高度,笠美->宽度,CV_16S);
CvMat*vdisp=cvCreateMat(笠美->高度,笠美->宽度,CV_16S);
cvConvert(笠美,matr);
cvConvert(石灰、材料);
CvStereoBMState*BMState=cvCreateStereoBMState();
断言(BMState!=0);
BMState->preFilterSize=21;
BMState->preFilterCap=31;
BMState->sadWindowsSize=21;
BMState->minDisparity=0;
BMState->numberofdifferentications=128;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
cvFindStereoCorrespondenceBM(材料、材料、显示、BMState);
cvNormalize(disp,vdisp,0,255,CV_MINMAX);
cvShowImage(“深度映射”,vdisp);
cvWaitKey(0);
返回0;
}
< p>这是一个使用C++ API的视差图代码。规格化的最终图像应为CV_8UC1类型
Mat img1, img2, g1, g2;
Mat disp, disp8;
img1 = imread("leftImage.jpg");
img2 = imread("rightImage.jpg");
cvtColor(img1, g1, CV_BGR2GRAY);
cvtColor(img2, g2, CV_BGR2GRAY);
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);
normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);
imshow("left", img1);
imshow("right", img2);
imshow("disp", disp8);
#包括
#包括
#包括
int main()
{
cv::Mat leftimg=cv::imread(“leftimage.jpg”);
cv::Mat rightimg=cv::imread(“righimage.jpg”);
cv::Mat disparation_left=cv::Mat(leftimg.size(),leftimg.type());
cv::Mat dispation_right=cv::Mat(rightimg.size(),rightimg.type());
cv::Mat g1、g2、disp、disp8;
cv::cvtColor(左img、g1、cv::COLOR_bgr2灰色);
cv::CVT颜色(右侧,g2,cv::颜色为灰色);
cv::Ptr sbm=cv::createStereoBM(16,21);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->SetSpeckleWindowsSize(9);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->设置预滤器盖(61);
sbm->setPreFilterSize(5);
sbm->compute(g1、g2、视差_左);
正常化(视差左、disp8、0、255、CV_最小值最大、CV_8U);
}
对我来说,它的工作原理与stereoBM对象的init略有不同
Ptr<StereoBM> sbm = cv::StereoBM::create(16, 5);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->setSpeckleWindowSize(0);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->setPreFilterCap(61);
sbm->setPreFilterSize(5);
sbm->compute(src1, src2, disp);
ptrsbm=cv::StereoBM::create(16,5);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->SetSpeckleWindowsSize(0);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->设置预滤器盖(61);
sbm->setPreFilterSize(5);
sbm->compute(src1、src2、disp);
我只能添加OpenCV名称空间和类的结构每年都在变化。
我将OpenCV 3.4.0的工作源代码放在下面
#include <Windows.h>
#include <Vfw.h>
#include <string>
#include <iostream>
#include "opencv2\core\core.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\calib3d\calib3d.hpp"
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat im_left=imread("right.png");
Mat im_right=imread("left.png");
cv::Size imagesize = im_left.size();
cv::Mat disparity_left=cv::Mat(imagesize.height,imagesize.width,CV_16S);
cv::Mat disparity_right=cv::Mat(imagesize.height,imagesize.width,CV_16S);
cv::Mat g1,g2,disp,disp8;
cv::cvtColor(im_left,g1,cv::COLOR_BGR2GRAY);
cv::cvtColor(im_right,g2,cv::COLOR_BGR2GRAY);
cv::Ptr<cv::StereoBM> sbm = cv::StereoBM::create(0,21);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->setSpeckleWindowSize(9);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->setPreFilterCap(61);
sbm->setPreFilterSize(5);
sbm->compute(g1,g2,disparity_left);
normalize(disparity_left, disp8, 0, 255, CV_MINMAX, CV_8U);
cv::namedWindow("Left",CV_WINDOW_FREERATIO);
cv::imshow("Left", im_left);
cv::namedWindow("Right",CV_WINDOW_FREERATIO);
cv::imshow("Right", im_right);
cv::namedWindow("Depth map",CV_WINDOW_FREERATIO);
cv::imshow("Depth map", disp8);
cv::waitKey(0);
return 0;
}
#包括
#包括
#包括
#包括
#包括“opencv2\core\core.hpp”
#包括“opencv2\imgproc\imgproc.hpp”
#包括“opencv2\imgcodecs\imgcodecs.hpp”
#包括“opencv2\highgui\highgui.hpp”
#包括“opencv2\calib3d\calib3d.hpp”
使用名称空间std;
使用名称空间cv;
int _tmain(int argc,_TCHAR*argv[]
{
Mat im_left=imread(“right.png”);
Mat im_right=imread(“left.png”);
cv::Size imagesize=im_left.Size();
cv::Mat Distansion_left=cv::Mat(imagesize.高度,imagesize.宽度,cv_16S);
cv::Mat Distansion_right=cv::Mat(imagesize.height,imagesize.width,cv_16S);
cv::Mat g1、g2、disp、disp8;
cv::CVT颜色(左侧,g1,cv::颜色为灰色);
cv::CVT颜色(右侧,g2,cv::颜色为灰色);
cv::Ptr sbm=cv::StereoBM::create(0,21);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->SetSpeckleWindowsSize(9);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->设置预滤器盖(61);
sbm->setPreFilterSize(5);
sbm->compute(g1、g2、视差_左);
正常化(视差左、disp8、0、255、CV_最小值最大、CV_8U);
cv::namedWindow(“左”,cv\u窗口\u自由比率);
cv::imshow(“左”,imu左);
cv::namedWindow(“右”,cv\u窗口\u自由比率);
cv::imshow(“右”,imu右);
cv::namedWindow(“深度图”,cv\u窗口\u自由比率);
cv::imshow(“深度图”,disp8);
cv::waitKey(0);
返回0;
}
我根据自己的需要编辑了代码,添加了摄像头1和摄像头2,并从中读取。
然后,制作了深度图。谢谢,希望对你有帮助
#include <string>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture leftCam(0); //lets say 0 is left, 1 is right
if (leftCam.isOpened() == false){cout << "error: Webcam connect unsuccessful\n"; return(0); }
VideoCapture rightCam(1); //lets say 0 is left, 1 is right
if (rightCam.isOpened() == false){cout << "error: Webcam connect unsuccessful\n"; return(0); }
Mat left, right;
Mat leftClone, rightClone;
char charCheckForEscKey = 0;
while ( charCheckForEscKey != 27 && leftCam.isOpened() )
{
leftCam.read(left);
if (left.empty()){cout << "No frame to read" << endl; break;}
leftClone = left.clone(); //copy from the left camera
imwrite("left.png", leftClone); // write it to screenshot.png in this directory
rightCam.read(right);
if (right.empty()){cout << "No frame to read" << endl; break;}
rightClone = right.clone(); //copy from the left camera
imwrite("right.png", rightClone); // write it to screenshot.png in this directory
Mat im_left = imread("left.png"); //left cam picture
Mat im_right = imread("right.png"); // right cam picture
Size imagesize = im_left.size();
Mat disparity_left= Mat(imagesize.height,imagesize.width,CV_16S);
Mat disparity_right=Mat(imagesize.height,imagesize.width,CV_16S);
Mat g1,g2,disp,disp8;
cvtColor(im_left,g1, COLOR_BGR2GRAY);
cvtColor(im_right,g2, COLOR_BGR2GRAY);
Ptr<cv::StereoBM> sbm = StereoBM::create(0,21);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->setSpeckleWindowSize(9);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->setPreFilterCap(61);
sbm->setPreFilterSize(5);
sbm->compute(g1,g2,disparity_left);
normalize(disparity_left, disp8, 0, 255, NORM_MINMAX, CV_8U);
namedWindow("Left", WINDOW_AUTOSIZE);
imshow("Left", im_left);
namedWindow("Right", WINDOW_AUTOSIZE);
imshow("Right", im_right);
namedWindow("Depth map", WINDOW_AUTOSIZE);
imshow("Depth map", disp8);
namedWindow("Left Cloned", WINDOW_FREERATIO);
imshow("Left Cloned", leftClone); // left is the left pic taken from camera 0
charCheckForEscKey = waitKey(1);
}
return(0);
#包括
#包括
#包括
#包括“opencv2/core/core.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/imgcodecs/imgcodecs.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/calib3d/calib3d.hpp”
使用名称空间std;
使用名称空间cv;
int main()
{
VideoCapture leftCam(0);//假设0为左,1为右
如果(leftCam.isOpened()==false){cout setMinDisparity(-39);
sbm->设置预滤器盖(61);
sbm->setPreFilterSize(5);
sbm->compute(g1、g2、视差_左);
标准化(左视差、disp8、0、255、标准最小值、CV 8U);
namedWindow(“左”,窗口自动调整大小);
imshow(“左”,imu左);
namedWindow(“右”,窗口自动大小);
imshow(“对”,imu Right);
namedWindow(“深度贴图”,窗口自动大小);
imshow(“深度图”,disp8);
namedWindow(“左克隆”,窗口自由比率);
imshow(“左克隆”,左克隆);//左是从相机0拍摄的左照片
charCheckForEscKey=waitKey(1);
}
返回(0);
}vdisp应为CV_8uc1型。请注意,c-api已失效。停止使用它。谢谢你的回答,我用CV_8UC1改变了图像的类型,但结果没有改变。我仍然有一个空的深度贴图。图像可能有问题。还有,你的StereoBM参数
#include <string>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture leftCam(0); //lets say 0 is left, 1 is right
if (leftCam.isOpened() == false){cout << "error: Webcam connect unsuccessful\n"; return(0); }
VideoCapture rightCam(1); //lets say 0 is left, 1 is right
if (rightCam.isOpened() == false){cout << "error: Webcam connect unsuccessful\n"; return(0); }
Mat left, right;
Mat leftClone, rightClone;
char charCheckForEscKey = 0;
while ( charCheckForEscKey != 27 && leftCam.isOpened() )
{
leftCam.read(left);
if (left.empty()){cout << "No frame to read" << endl; break;}
leftClone = left.clone(); //copy from the left camera
imwrite("left.png", leftClone); // write it to screenshot.png in this directory
rightCam.read(right);
if (right.empty()){cout << "No frame to read" << endl; break;}
rightClone = right.clone(); //copy from the left camera
imwrite("right.png", rightClone); // write it to screenshot.png in this directory
Mat im_left = imread("left.png"); //left cam picture
Mat im_right = imread("right.png"); // right cam picture
Size imagesize = im_left.size();
Mat disparity_left= Mat(imagesize.height,imagesize.width,CV_16S);
Mat disparity_right=Mat(imagesize.height,imagesize.width,CV_16S);
Mat g1,g2,disp,disp8;
cvtColor(im_left,g1, COLOR_BGR2GRAY);
cvtColor(im_right,g2, COLOR_BGR2GRAY);
Ptr<cv::StereoBM> sbm = StereoBM::create(0,21);
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->setSpeckleWindowSize(9);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->setPreFilterCap(61);
sbm->setPreFilterSize(5);
sbm->compute(g1,g2,disparity_left);
normalize(disparity_left, disp8, 0, 255, NORM_MINMAX, CV_8U);
namedWindow("Left", WINDOW_AUTOSIZE);
imshow("Left", im_left);
namedWindow("Right", WINDOW_AUTOSIZE);
imshow("Right", im_right);
namedWindow("Depth map", WINDOW_AUTOSIZE);
imshow("Depth map", disp8);
namedWindow("Left Cloned", WINDOW_FREERATIO);
imshow("Left Cloned", leftClone); // left is the left pic taken from camera 0
charCheckForEscKey = waitKey(1);
}
return(0);