关于立体校正后图像问题

jingli6890 2017-05-18 06:10:05
matlab标定后得到内参与外参 然后用opencv得到旋转矩阵与平移矩阵然后进行立体矫正 得到的图片使这样的 根本没法用 请问大侠是什么问题。
另附代码
// match.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <fstream>
#include <iostream>
#include <Windows.h>
using namespace cv;
using namespace std;
Rect validROIL,validROIR;
//左相机内参数矩阵
double LM[3][3] = {3580.44600, 0,1042.55799,
0, 3579.70317 ,783.38929,
0, 0, 1};
//左相机畸变系数
double LD[5]= { -0.08776 , 0.28040 , 0.00056 , -0.00093 , 0.00000 };

//右相机内参数矩阵
double RM[3][3] = {3542.92697, 0,1017.12453,
0, 3543.31224 ,771.34343,
0, 0, 1};
//右相机畸变系数
double RD[5]= { -0.09167 , 0.73632 , -0.00213, 0.00240 ,0.00000 };
//右相机旋转矩阵
double Rotate[3][3] = {0.736925,
0.040977,
0.674731,
0.014852,
0.996938,
-0.076767,
-0.675811,
0.066593,
0.734061};
double translation[3][1] = { -93.80548 , 5.87551 , 88.00076};
Mat ocv_bm(Mat left,Mat right){

Mat disp,disp8;

cv::StereoBM sbm;

sbm.state->SADWindowSize = 5;
sbm.state->numberOfDisparities = 112;
sbm.state->preFilterSize = 5;
sbm.state->preFilterCap = 1;
sbm.state->minDisparity = 0;
sbm.state->textureThreshold = 7;
sbm.state->uniquenessRatio = 5;
sbm.state->speckleWindowSize = 0;
sbm.state->speckleRange = 20;
sbm.state->disp12MaxDiff = 64;
sbm(left, right,disp);
normalize(disp, disp8, 0.1, 255, CV_MINMAX, CV_8U);

return disp8;
}

int _tmain(int argc, _TCHAR* argv[])
{
IplImage *imge1=cvLoadImage("E://leftpicture03.jpg");
IplImage *imge2=cvLoadImage("E://rightpicture03.jpg");

CvSize imageSize = cvGetSize (imge1);
cv::Mat cameraMatrix_L = cv::Mat(3,3,CV_64FC1,LM);
cv::Mat distortionCoefficients_L = cv::Mat(1,5,CV_64FC1,LD);
cv::Mat cameraMatrix_R = cv::Mat(3,3,CV_64FC1,RM);
cv::Mat distortionCoefficients_R = cv::Mat(1,5,CV_64FC1,RD);

cv::Mat rotations= cv::Mat(3,3,CV_64FC1,Rotate);
cv::Mat translations= cv::Mat(3,1,CV_64FC1,translation);

cv::Rect roi1,roi2;
cv::Mat m_Calib_Mat_Remap_X_L = cv::Mat(imageSize, CV_64FC1);
cv::Mat m_Calib_Mat_Remap_Y_L= cv::Mat(imageSize, CV_64FC1);
cv::Mat m_Calib_Mat_Remap_X_R = cv::Mat(imageSize, CV_64FC1);
cv::Mat m_Calib_Mat_Remap_Y_R = cv::Mat(imageSize, CV_64FC1);
double r1[3][3],r2[3][3],p1[3][4],p2[3][4],q[3][4];
Mat R1=Mat(3, 3, CV_64FC1, r1);
Mat R2=Mat(3, 3, CV_64FC1, r2);
Mat P1=Mat(3, 4, CV_64FC1, p1);
Mat P2=Mat(3, 4, CV_64FC1, p2);
Mat Q=Mat(3, 4, CV_64FC1, q);;
cv::stereoRectify(
cameraMatrix_L,
distortionCoefficients_L,
cameraMatrix_R,
distortionCoefficients_R,
imageSize,
rotations,
translations,
R1,R2,P1,P2,Q,CV_CALIB_ZERO_DISPARITY,-1,imageSize,&validROIL,&validROIR );
initUndistortRectifyMap(
cameraMatrix_L,
distortionCoefficients_L,
R1,P1,
imageSize,
CV_32FC1,
m_Calib_Mat_Remap_X_L, m_Calib_Mat_Remap_Y_L);
initUndistortRectifyMap(
cameraMatrix_R,
distortionCoefficients_R,
R2, P2,
imageSize,
CV_32FC1,
m_Calib_Mat_Remap_X_R,m_Calib_Mat_Remap_Y_R);
cv::Mat frame0, frame1;
frame0 = imread("E://leftpicture01.jpg");
frame1 = imread("E://rightpicture01.jpg");
Mat frame0_1;
Mat frame1_1;
Mat frame0_1_1;
Mat frame1_1_1;
cvtColor(frame0,frame0_1,CV_RGB2GRAY);
cvtColor(frame1,frame1_1,CV_RGB2GRAY);
remap(frame0_1, frame0_1_1, m_Calib_Mat_Remap_X_L, m_Calib_Mat_Remap_Y_L, INTER_LINEAR);
remap(frame1_1, frame1_1_1, m_Calib_Mat_Remap_X_R, m_Calib_Mat_Remap_Y_R, INTER_LINEAR);
cvtColor(frame0_1_1,frame0,CV_GRAY2RGB);
cvtColor(frame1_1_1,frame1,CV_GRAY2RGB);
imshow("l",frame0);
imshow("r",frame1);
Mat canvas;
double sf;
int w, h;
sf = 600. / MAX(imageSize.width, imageSize.height);
w = cvRound(imageSize.width * sf);
h = cvRound(imageSize.height * sf);
canvas.create(h, w * 2, CV_8UC3);

/*左图像画到画布上*/
Mat canvasPart = canvas(Rect(w*0, 0, w, h)); //得到画布的一部分
resize(frame0, canvasPart, canvasPart.size(), 0, 0, INTER_AREA); //把图像缩放到跟canvasPart一样大小
Rect vroiL(cvRound(validROIL.x*sf), cvRound(validROIL.y*sf), //获得被截取的区域
cvRound(validROIL.width*sf), cvRound(validROIL.height*sf));
rectangle(canvasPart, vroiL, Scalar(0, 0, 255), 3, 8); //画上一个矩形

cout << "Painted ImageL" << endl;

/*右图像画到画布上*/
canvasPart = canvas(Rect(w, 0, w, h)); //获得画布的另一部分
resize(frame1, canvasPart, canvasPart.size(), 0, 0, INTER_LINEAR);
Rect vroiR(cvRound(validROIR.x * sf), cvRound(validROIR.y*sf),
cvRound(validROIR.width * sf), cvRound(validROIR.height * sf));
rectangle(canvasPart, vroiR, Scalar(0, 255, 0), 3, 8);

cout << "Painted ImageR" << endl;

/*画上对应的线条*/
for (int i = 0; i < canvas.rows;i+=16)
line(canvas, Point(0, i), Point(canvas.cols, i), Scalar(0, 255, 0), 1, 8);

imshow("rectified", canvas);

cout << "wait key" << endl;
cvWaitKey(0);
return 0;

}

...全文
1048 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
星辰韦 2017-06-07
  • 打赏
  • 举报
回复
看这个吧 http://blog.csdn.net/zc850463390zc/article/details/48975263 把stereoRectify之前的去掉基本就是你要的了 你那些内外参写的有问题啊,首先格式写成Mat,畸变系数Matlab只有2阶和3阶两种模式,到opencv里后面直接填0
赵4老师 2017-05-19
  • 打赏
  • 举报
回复
搜“halcon”?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧