欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解

 更新時(shí)間:2021年11月25日 10:07:28   作者:語(yǔ)音余音玉印  
相機(jī)標(biāo)定是圖像處理的基礎(chǔ),現(xiàn)在市面上買到的相機(jī),都存在著或多或少的畸變。本文將介紹如何利用一系列棋盤照片進(jìn)行攝像機(jī)標(biāo)定的,感興趣的小伙伴可以關(guān)注一下

環(huán)境準(zhǔn)備

vs2015+opencv4.10安裝與配置

相機(jī)標(biāo)定

棋盤格圖片

可以自己生成,然后打印到A4紙上。(也可以去TB買一塊,平價(jià)買亞克力板的,不反光買氧化鋁材質(zhì),高精度買陶瓷的)

/**
* 生成棋盤格圖片
**/
int generateCalibrationPicture()
{
	//Mat frame = imread("3A4.bmp"); // cols*rows = 630*891  
	Mat frame(1600, 2580, CV_8UC3, Scalar(0, 0, 0));
	int nc = frame.channels();
	int nWidthOfROI = 320;
	for (int j = 10; j<frame.rows - 10; j++)
	{
		uchar* data = frame.ptr<uchar>(j);
		for (int i = 10; i<(frame.cols - 10)*nc; i += nc)
		{
			if ((i / nc / nWidthOfROI + j / nWidthOfROI) % 2)
			{
				// bgr  
				data[i / nc*nc + 0] = 255;
				data[i / nc*nc + 1] = 255;
				data[i / nc*nc + 2] = 255;
			}
		}
	}
	imshow("test", frame);
	//imwrite("3.bmp", frame);
	waitKey(0);
	return 0;
}

實(shí)時(shí)顯示相機(jī)的畫面

準(zhǔn)備一個(gè)相機(jī),我的是usb相機(jī)(羅技100多的)。

int displayCameraRealTime()
{
	//1.從攝像頭讀入視頻
	VideoCapture capture(0);
	if (!capture.isOpened()) {
		std::cout << "無(wú)法開(kāi)啟攝像頭!" << std::endl;
		return -1;
	}
	//2.循環(huán)顯示每一幀
	while (1)
	{
		Mat cam;
		capture >> cam;//獲取當(dāng)前幀圖像
		namedWindow("實(shí)時(shí)相機(jī)畫面", WINDOW_AUTOSIZE);
		imshow("實(shí)時(shí)相機(jī)畫面", cam);//顯示當(dāng)前幀圖像
							  //imwrite(to_string(i) + ".png", cam);
		waitKey(20);//延時(shí)20ms
	}
}

效果如下圖:

在線標(biāo)定

把打印的棋盤格固定在板子上

/**
* 實(shí)時(shí)檢測(cè)角點(diǎn),按鍵保存角點(diǎn)參數(shù),達(dá)到數(shù)量執(zhí)行標(biāo)定并保存標(biāo)定結(jié)果
* @param numBoards			需要幾張標(biāo)定圖片,即獲取幾組角點(diǎn)參數(shù)
* @param boardSize			格子尺寸Size 7*4
* @param squareSize			格子尺寸 mm
* @param flipHorizontal		是否翻轉(zhuǎn)
*/
int calibrateCameraRealTime(int numBoards, cv::Size boardSize, float squareSize = 1, int delay = 50, bool flipHorizontal = false);

實(shí)時(shí)顯示相機(jī)畫面,按鍵保存能檢測(cè)到角點(diǎn)的 棋盤格圖片

int saveChessboardImages(cv::Size boardSize, string savePath)
{
	//1.從攝像頭讀入視頻
	VideoCapture capture(0);
	if (!capture.isOpened()) {
		std::cout << "無(wú)法開(kāi)啟攝像頭!" << std::endl;
		return -1;
	}
	if (savePath != "./")
	{
		myMkdir(savePath);
	}
	//2.循環(huán)顯示每一幀
	while (1) {
		Mat image0, image;
		capture >> image0;
		// 將圖像復(fù)制到image
		image0.copyTo(image);
		// 查找標(biāo)定板(不對(duì)稱圓網(wǎng)格板)
		vector<Point2f> corners;
		//bool found = findCirclesGrid(image, boardSize, corners, CALIB_CB_ASYMMETRIC_GRID);
		bool found = findChessboardCorners(image, boardSize, corners, CALIB_CB_FAST_CHECK);
		// 畫上去
		drawChessboardCorners(image, boardSize, corners, found);
		int action = waitKey(30) & 255;
		// 判斷動(dòng)作
		if (action == ACTION_SPACE) { // 用戶按下了空格
			if (found) {
				// 保存圖片
				string imgFileName = savePath + getCurrentTime() + ".png";
				imwrite(imgFileName, image0);
				cout << imgFileName << " saved" << endl;
			}
			else {
				printf("%s\n", "未檢測(cè)到角點(diǎn)");
			}
		}
		else if (action == ACTION_ESC) { // 用戶按下了ESC
			break;
		}
		cv::imshow("Calibration", image);
	}
	cv::destroyAllWindows();
	return 1;
}

離線標(biāo)定

/**
* 離線相機(jī)標(biāo)定
* @param imagePath    標(biāo)定圖片存放路徑
* @param boardSize    格子尺寸Size 7*4
* @param squareSize   格子尺寸 mm
*/
int calibrateCameraOffLine(string imagePath, const Size boardSize, float squareSize = 1);

畸變矯正

/**
* 去畸變 1、本地圖片 2、實(shí)時(shí)相機(jī)圖像
* @param path		標(biāo)定參數(shù)存放路徑
* @param imagePath	需要矯正的圖片 存放路徑
*/
int undistortRectifyImage(string paraPath, string imagePath = " ");

矯正效果貌似不明顯

完整工程地址

到此這篇關(guān)于OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解的文章就介紹到這了,更多相關(guān)OpenCV 相機(jī)標(biāo)定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt實(shí)現(xiàn)文本編輯器(一)

    Qt實(shí)現(xiàn)文本編輯器(一)

    在Qt中QMainWindow是一個(gè)為用戶提供主窗口程序的類,包含了:菜單欄、工具欄、錨接部件、狀態(tài)欄以及一個(gè)中部件。本文將利用QMainWindow制作一個(gè)文本編輯器,感興趣的可以試一試
    2022-01-01
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++ vector容器 find erase的使用操作:查找并刪除指定元素

    C++ vector容器 find erase的使用操作:查找并刪除指定元素

    這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 一篇文章教你3分鐘如何發(fā)布Qt程序

    一篇文章教你3分鐘如何發(fā)布Qt程序

    這篇文章主要給大家介紹了關(guān)于教你3分鐘如何發(fā)布Qt程序的相關(guān)資料,文中通過(guò)實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • VC中使用GDI+的配置方法概述

    VC中使用GDI+的配置方法概述

    這篇文章主要介紹了VC中使用GDI+的配置方法,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 數(shù)據(jù)結(jié)構(gòu) 紅黑樹(shù)的詳解

    數(shù)據(jù)結(jié)構(gòu) 紅黑樹(shù)的詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 紅黑樹(shù)的詳解的相關(guān)資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹(shù)查找,紅黑樹(shù)的講解,需要的朋友可以參考下
    2017-07-07
  • vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序

    vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序

    今天發(fā)現(xiàn)網(wǎng)上好多MFC代碼都不能用,給大家分享一個(gè)簡(jiǎn)單的MFC窗口語(yǔ)言,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • MFC LoadImage用法案例詳解

    MFC LoadImage用法案例詳解

    這篇文章主要介紹了MFC LoadImage用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++的繼承和派生你了解嗎

    C++的繼承和派生你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++繼承和派生,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論