在qt中写好opencv环境配置
一、利用双目打开摄像头
按Q进行拍照
#include "opencv2/opencv.hpp"
#include <string>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture inputVideo(0);
//inputVideo.set(CV_CAP_PROP_FRAME_WIDTH, 320);
//inputVideo.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
if (!inputVideo.isOpened())
{
cout << "Could not open the input video " << endl;
return -1;
}
Mat frame;
string imgname;
int f = 1;
while (1) //Show the image captured in the window and repeat
{
inputVideo >> frame; // read
if (frame.empty()) break; // check if at end
imshow("Camera", frame);
char key = waitKey(1);
if (key == 27)break;
if (key == 'q' || key == 'Q')
{
imgname = to_string(f++) + ".jpg";
imwrite(imgname, frame);
}
}
cout << "Finished writing" << endl;
return 0;
}
能打开相机,但是是两张图片在一起的,标定的话需要左右相机拍摄照片分开。
来自:https://blog.csdn.net/Loser__Wang/article/details/51811347
二、将双目相机拍照并且分为左右两张图片
按空格键拍照,照片存在工程项目下的文件夹里
#include<iostream>
#include<string>
#include<sstream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/videoio.hpp>
#include<opencv2/opencv.hpp>
#include<stdio.h>
using namespace std;
using namespace cv;
//双目摄像头支持2560x720, 1280x480,640x240
#define FRAME_WIDTH 1280
#define FRAME_HEIGHT 480
const char* keys =
{
"{help h usage ? | | print this message}"
"{@video | | Video file, if not defined try to use webcamera}"
};
int main(int argc, char** argv)
{
CommandLineParser parser(argc, argv, keys);
parser.about("Video Capture");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
String videoFile = parser.get<String>(0);
if (!parser.check())
{
parser.printErrors();
return 0;
}
VideoCapture cap;
if (videoFile != "")
{
cap.open(videoFile);
}
else
{
cap.open(0); //0-笔记本自带摄像头,1-外接usb双目摄像头
cap.set(CV_CAP_PROP_FRAME_WIDTH, FRAME_WIDTH); //设置捕获视频的宽度
cap.set(CV_CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT); //设置捕获视频的高度
}
if (!cap.isOpened())
{
cout << "摄像头打开失败!" << endl;
return -1;
}
Mat frame, frame_L, frame_R;
cap >> frame; //从相机捕获一帧
Mat grayImage;
double fScale = 1.;
Size dsize = Size(frame.cols*fScale, frame.rows*fScale);
Mat imagedst = Mat(dsize, CV_32S);
resize(frame, imagedst, dsize);
char key;
char image_left[200];
char image_right[200];
int count1 = 0;
int count2 = 0;
int count = 0;
namedWindow("图片1", 1);
namedWindow("图片2", 1);
while(1)
{
key = waitKey(50);
cap >> frame;
count++;
resize(frame, imagedst, dsize);
frame_L = imagedst(Rect(0, 0, FRAME_WIDTH/2, FRAME_HEIGHT));
namedWindow("Video_L", 1);
imshow("Video_L", frame_L);
frame_R = imagedst(Rect(FRAME_WIDTH/2, 0, FRAME_WIDTH/2, FRAME_HEIGHT));
namedWindow("Video_R", 1);
imshow("Video_R", frame_R);
if (key == 27)
break;
if (key == 32) //使用空格键拍照
//if (0 == (count % 100)) //每5秒定时拍照
{
snprintf(image_left, sizeof(image_left), "left%02d.jpg", ++count1);
imwrite(image_left, frame_L);
imshow("图片1", frame_L);
snprintf(image_right, sizeof(image_right), "right%02d.jpg", ++count2);
imwrite(image_right, frame_R);
imshow("图片2", frame_R);
}
}
cap.release();
return 0;
}
来自:https://blog.csdn.net/formaever/article/details/106897648
三、双目相机标定
matlab键入 stereoCameraCalibrator出现APP工具
各添加左右文件夹的照片,并写好标定板上每格的真实尺寸。
我就是出现了什么不能用花括号,什么数组维度不一致的错误,不要犹豫,matlab的版本有问题,更新一下。
点击界面上方按钮Export Camera Parameters,即可导出标定结果。在matlab主界面可查看。
打开一个相机
但是注意内参矩阵需要转换一下,左边为matlab导出的矩阵参数,找好fx fy cx cy的值。
四、畸变矫正
(1)这个程序是对单张照片校正,出来的是灰度图
利用是上面的参数,只能一张图片进行矫正,只能左右目分开矫正,注意左右目的畸变参数的不同。
#include <opencv2/opencv.hpp>
#include <string>
#include <math.h>
using namespace std;
string image_file = "/home/shs/SM/left01.jpg"; // 请确保路径正确
int main(int argc, char **argv) {
// 本程序需要你自己实现去畸变部分的代码。尽管我们可以调用OpenCV的去畸变,但自己实现一遍有助于理解。
// 畸变参数
double k1 = -0.28340811, k2 = 0.07395907, p1 = 0.00019359, p2 = 1.76187114e-05;
// 内参
double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;
cv::Mat image = cv::imread(image_file,0); // 图像是灰度图,CV_8UC1
int rows = image.rows, cols = image.cols;
cv::Mat image_undistort = cv::Mat(rows, cols, CV_8UC1); // 去畸变以后的图
// 计算去畸变后图像的内容
for (int v = 0; v < rows; v++)
for (int u = 0; u < cols; u++) {
double u_distorted = 0, v_distorted = 0;
// TODO 按照公式,计算点(u,v)对应到畸变图像中的坐标(u_distorted, v_distorted) (~6 lines)
// start your code here
//image_undistort中含有非畸变的图像坐标
//将image_undistort的坐标通过内参转换到归一化坐标系下,此时得到的归一化坐标是对的
//将得到的归一化坐标系进行畸变处理
//将畸变处理后的坐标通过内参转换为图像坐标系下的坐标
//这样就相当于是在非畸变图像的图像坐标和畸变图像的图像坐标之间建立了一个对应关系
//相当于是非畸变图像坐标在畸变图像中找到了映射
//对畸变图像进行遍历之后,然后赋值(一般需要线性插值,因为畸变后图像的坐标不一定是整数的),即可得到矫正之后的图像
double x1,y1,x2,y2;