OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解
環(huán)境準(zhǔn)備
vs2015+opencv4.10安裝與配置
相機(jī)標(biāo)定

棋盤(pán)格圖片
可以自己生成,然后打印到A4紙上。(也可以去TB買(mǎi)一塊,平價(jià)買(mǎi)亞克力板的,不反光買(mǎi)氧化鋁材質(zhì),高精度買(mǎi)陶瓷的)
/**
* 生成棋盤(pán)格圖片
**/
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ī)的畫(huà)面
準(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ī)畫(huà)面", WINDOW_AUTOSIZE);
imshow("實(shí)時(shí)相機(jī)畫(huà)面", cam);//顯示當(dāng)前幀圖像
//imwrite(to_string(i) + ".png", cam);
waitKey(20);//延時(shí)20ms
}
}
效果如下圖:

在線標(biāo)定
把打印的棋盤(pán)格固定在板子上
/** * 實(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ī)畫(huà)面,按鍵保存能檢測(cè)到角點(diǎn)的 棋盤(pá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ì)稱(chēng)圓網(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);
// 畫(huà)上去
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)文章
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的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
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ù)的詳解的相關(guān)資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹(shù)查找,紅黑樹(shù)的講解,需要的朋友可以參考下2017-07-07
vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序
今天發(fā)現(xiàn)網(wǎng)上好多MFC代碼都不能用,給大家分享一個(gè)簡(jiǎn)單的MFC窗口語(yǔ)言,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

