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;
}
uj5u.com熱心網友回復:
搜“halcon”?uj5u.com熱心網友回復:
看這個吧http://blog.csdn.net/zc850463390zc/article/details/48975263
把stereoRectify之前的去掉基本就是你要的了
你那些內外參寫的有問題啊,首先格式寫成Mat,畸變系數Matlab只有2階和3階兩種模式,到opencv里后面直接填0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/98297.html
標籤:圖形處理/算法
上一篇:GetScrollPosition()函式在OnDraw里呼叫會中斷
下一篇:有關于skin++美化界面的問題
