just do it

与其苟延残喘,不如纵情燃烧

利用相机内外参读取矫正后的视频流

主要目的


  • 利用所得到的内外参矩阵读取矫正后的相机的视频流
    (因为用到的摄像头是红外线摄像头(监控摄像头),有必要了解其原理)从光谱来讲,和普通摄像头感可见光原理类似。红外摄像头工作原理是红外灯发出红外线照射物体,红外线漫反射,被监控摄像头接收,形成视频图像。

程序源码

整个项目主要包括以下程序

main.cpp
  
#include 
#include 
#include 
#include"CameraCalibrator.h"
using namespace cv;
using namespace std;
int main()
{
	VideoCapture capture(1);
	CameraCalibrator cameraCalibrator;
	if (capture.isOpened())
	{
		cout << "success" << endl;
	}	
	Mat frame;
	Mat ROI;
	while (capture.isOpened())
	{
		capture >> frame;	
		Mat uImage = cameraCalibrator.remap(frame);
		ROI = uImage(Rect(60, 0, 560, 410));
		imshow("video1", ROI);
		cout << uImage.size() << endl;
		char key = static_cast(waitKey(50));//控制视频流的帧率,50ms一帧
		if (key == 27)  //按esc退出
			break;
	}
	return 0;
}
calibrate.h()
  
class CameraCalibrator {
	vector> objectPoints;
	vector> imagePoints;
Mat cameraMatrix;
Mat distCoeffs;
	
int flag;
	
Mat map1, map2;
bool mustInitUndistort;

public:
	CameraCalibrator() : flag(0), mustInitUndistort(true) {};
	
	int addChessboardPoints(const std::vector<std::string>& filelist, cv::Size & boardSize);
			// Add scene points and corresponding image points
	void addPoints(const std::vector<cv::Point2f>& imageCorners, const std::vector<cv::Point3f>& objectCorners);
			// Calibrate the camera
	double calibrate(cv::Size &imageSize);
			// Set the calibration flag
	void setCalibrationFlag(bool radial8CoeffEnabled = false, bool tangentialParamEnabled = false);
			// Remove distortion in an image (after calibration)
	cv::Mat CameraCalibrator::remap(const cv::Mat &image);
	
		// Getters
	cv::Mat getCameraMatrix() { return cameraMatrix; }
	cv::Mat getDistCoeffs() { return distCoeffs; }
};

CameraCalibrator.cpp
  
#include "CameraCalibrator.h"
using namespace cv;
cv::Mat CameraCalibrator::remap(const cv::Mat &image) 
{		
    cv::Mat undistorted;
    cv::Mat cameraMatrix = cv::Mat::eye(3, 3, CV_64F);
//内参矩阵
cameraMatrix.at<double>(0, 0) = 304.5343301172393;
cameraMatrix.at<double>(0, 1) = 0;
cameraMatrix.at<double>(0, 2) = 355.6868747437238;
cameraMatrix.at<double>(1, 0) = 0;
cameraMatrix.at<double>(1, 1) = 304.4062190996952;
cameraMatrix.at<double>(1, 2) = 275.6767450385067;
cameraMatrix.at<double>(2, 0) = 0;
cameraMatrix.at<double>(2, 1) = 0;
cameraMatrix.at<double>(2, 2) = 1;
//畸变参数
cv::Mat distCoeffs = cv::Mat::zeros(5, 1, CV_64F);
distCoeffs.at<double>(0, 0) = -0.3559459318901729;
distCoeffs.at<double>(1, 0) = 0.1634235977115495;
distCoeffs.at<double>(2, 0) = 0.000291221640019827;
distCoeffs.at<double>(3, 0) = 0.002862694736722168;
distCoeffs.at<double>(4, 0) = -0.04160147169190362;
	
if (mustInitUndistort) 
        { // called once per calibration
	
	cv::initUndistortRectifyMap(
				cameraMatrix,  // computed camera matrix
				distCoeffs,    // computed distortion matrix
				cv::Mat(),     // optional rectification (none) 
				cv::Mat(),     // camera matrix to generate undistorted
				cv::Size(720, 540),
				//            image.size(),  // size of undistorted
				CV_32FC1,      // type of output map
				map1, map2);   // the x and y mapping functions
	
			mustInitUndistort = false;
	}
		// Apply mapping functions
	cv::remap(image, undistorted, map1, map2,
	cv::INTER_LINEAR); // interpolation type
	
return undistorted;

}

posted @ 2019-05-16 22:59  elong1995  阅读(241)  评论(0编辑  收藏  举报