国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv對(duì)相機(jī)進(jìn)行畸變校正,及校正前后的坐標(biāo)對(duì)應(yīng)

這篇具有很好參考價(jià)值的文章主要介紹了opencv對(duì)相機(jī)進(jìn)行畸變校正,及校正前后的坐標(biāo)對(duì)應(yīng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.背景

目前有個(gè)項(xiàng)目,需要用到熱成像相機(jī)。但是這個(gè)熱成像相機(jī)它的畸變比較厲害,因此需要用標(biāo)定板進(jìn)行標(biāo)定,從而消除鏡頭畸變。
同時(shí)需要實(shí)現(xiàn)用戶用鼠標(biāo)點(diǎn)擊校正后的畫(huà)面后,顯示用戶點(diǎn)擊位置的像素所代表的溫度。
另外熱成像sdk中還有個(gè)功能:選定一個(gè)rect,可以返回這個(gè)rect中的最高最低溫度以及其各自的位置。假如我們需要這個(gè)功能,那么又需要知道從src到dst的關(guān)系了。

2.需求分析

消除鏡頭畸變后,就不能直接使用熱成像sdk提供的函數(shù)來(lái)查詢像素對(duì)應(yīng)的溫度。
因?yàn)樵诓樵兒瘮?shù)中,有個(gè)像素坐標(biāo)的形參,要求傳入原來(lái)的熱成像圖像A的像素坐標(biāo),函數(shù)返回此像素位置的溫度。
而我們經(jīng)過(guò)畸變消除后,得到畫(huà)面B。B上面的特定像素所處的坐標(biāo)和原圖不一定一樣。
因此,假如用戶想查詢畫(huà)面B上的某個(gè)像素點(diǎn)的有效溫度,就必須要取得此像素點(diǎn)在原圖A上的位置坐標(biāo)。
而在知道原圖的最高最低溫度點(diǎn)的位置后,需要知道其在校正后的畫(huà)面中的位置,才能準(zhǔn)確繪制出來(lái)。
總結(jié)一下,需要實(shí)現(xiàn)以下功能:
a、鏡頭畸變校正
b、知道校正后的畫(huà)面坐標(biāo)(x,y),求其在原畫(huà)面的坐標(biāo)(x’,y’)
c、知道原畫(huà)面坐標(biāo)(x1,y1),求其在校正后的畫(huà)面坐標(biāo)(x2,y2)

3.解決方案

其實(shí)很簡(jiǎn)單,opencv本身就提供了。

3.1.鏡頭畸變校正

在經(jīng)過(guò) findChessboardCorners、calibrateCamera之后,我們就已經(jīng)獲得了相機(jī)矩陣cameraMatrix、畸變矩陣distCoeffs。
然后,我們利用getOptimalNewCameraMatrix,獲得了一個(gè)相對(duì)容易控制畫(huà)面取舍的新相機(jī)矩陣newCamMatrix。
接下來(lái),就有兩種方式對(duì)畫(huà)面進(jìn)行校正:
a、直接undistort。
b、先利用initUndistortRectifyMap得到map1、map2,然后再利用remap進(jìn)行畫(huà)面校正。
后面的代碼把兩種都演示了。

3.2.知道校正后的畫(huà)面坐標(biāo)(x, y),求其在原畫(huà)面的坐標(biāo)(x’, y’)

其實(shí),我們真正需要的是第二種。
關(guān)鍵就在于map1、map2。
這兩個(gè)矩陣是什么玩意呢?
其實(shí)你先看看他們的尺寸、通道數(shù),再查閱一下資料就知道了:
map1、map2的尺寸與目標(biāo)圖像(校正后的圖像)的尺寸一致,而通道數(shù)為1(這個(gè)其實(shí)不一定,與其他參數(shù)有關(guān),暫時(shí)先這樣認(rèn)為)。我們假設(shè),最終圖像(x,y)處的像素來(lái)源于源圖像(x’,y’)處,那么,map1中存儲(chǔ)了坐標(biāo)(x’,y’)中的x’,而map2中存儲(chǔ)了y’。
雖然我描述得很混亂,但是你配合代碼應(yīng)該明白我在說(shuō)什么。??
所以,我們直接利用這個(gè)map1、map2就可以實(shí)現(xiàn)從消除畸變后的畫(huà)面坐標(biāo)轉(zhuǎn)換到原畫(huà)面的坐標(biāo)了。

    initUndistortRectifyMap(cameraMatrix, distCoeffs, cv::Mat(), newCamMatrix, imageSize, CV_32FC1, map1, map2);
    
    ......
   
    Point dstPt(400, 109);
    double pt_x = map1.at<float>(dstPt);
    double pt_y = map2.at<float>(dstPt);

3.2.知道原畫(huà)面坐標(biāo)(x1, y1),求其在校正后的畫(huà)面坐標(biāo)(x2, y2)

這個(gè)可以利用opencv的undistortPoints函數(shù)進(jìn)行求解。
假如你是單目相機(jī)標(biāo)定,需要注意第三個(gè)參數(shù)使用相機(jī)矩陣、第五個(gè)參數(shù)使用空矩陣、第六個(gè)參數(shù)使用新相機(jī)矩陣。這些參數(shù)需要和initUndistortRectifyMap的相對(duì)應(yīng)起來(lái)。

    vector<Point2f> srcPts;
    srcPts.push_back(Point2f(300, 145));
    vector<Point2f> dstPts;
    undistortPoints(srcPts, dstPts, cameraMatrix, distCoeffs, Mat(), newCamMatrix);

假如你用的是立體相機(jī)標(biāo)定的話【opencv/samples/cpp/stereo_calib.cpp】,可以直接把得到的R、P填上去:

  stereoRectify(cameraMatrix[0], distCoeffs[0],
            cameraMatrix[1], distCoeffs[1],
            imageSize, R, T, R1, R2, P1, P2, Q,
            CALIB_ZERO_DISPARITY, 1, imageSize, &validRoi[0], &validRoi[1]);
......
  vector<Point2f> srcPts;
  srcPts.push_back(Point2f(110, 205));
  vector<Point2f> dstPts;
  undistortPoints(srcPts, dstPts, cameraMatrix[0], distCoeffs[0], R1, P1);

4.效果

由于一些原因,我不能直接展示我的效果圖。這里用opencv自帶的圖像來(lái)演示吧。
opencv相機(jī)畸變校正,opencv,opencv,數(shù)碼相機(jī),人工智能

5.代碼

int cameraCalibration()
{
    Size boardSize = {9, 6};
    float squareSize = 0.05;
    bool displayCorners = false;

    vector<string> imageList;
    for(int i = 0; i < 9; i++)
    {
        QString leftImgFile = QString("../data/left%1.jpg").arg(i + 1, 2, 10, QLatin1Char('0'));
        imageList.push_back(leftImgFile.toStdString());
    }

    // 存放相機(jī)的圖像的角點(diǎn)位置
    vector<vector<Point2f>> imagePoints;
    // 存放實(shí)際的物體坐標(biāo)
    vector<vector<Point3f>> objectPoints;

    Size imageSize;

    int i, j, nimages = imageList.size();

    imagePoints.resize(nimages);

    // 存放能夠順利找到角點(diǎn)的圖像的路徑
    vector<string> goodImageList;

    for(i = 0, j = 0; i < nimages; i++ )
    {
        const string& filename = imageList[i];
        Mat img = imread(filename, IMREAD_GRAYSCALE);

        // 檢查圖像是否為空
        if(img.empty())
            continue;

        imageSize = img.size();

        // 找角點(diǎn)
        bool found = false;
        vector<Point2f>& corners = imagePoints[j];
        found = findChessboardCorners(img, boardSize, corners,
                                      CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
        if(found == false)
        {
            continue;
        }

        // 再進(jìn)行一次亞像素查找
        cornerSubPix(img, corners, Size(11,11), Size(-1,-1),
                     TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,
                                  30, 0.01));


        // 顯示查找的結(jié)果
        if(displayCorners)
        {
            cout << "found:" << filename.c_str() << endl;
            Mat cimg;
            cvtColor(img, cimg, COLOR_GRAY2BGR);
            drawChessboardCorners(cimg, boardSize, corners, found);
            imshow("corners", cimg);
            char c = (char)waitKey(100);
        }

        goodImageList.push_back(imageList[i]);
        j++;
    }

    nimages = j;
    if( nimages < 2 )
    {
        cout << "Error: too little data to run the calibration\n";
        return -1;
    }

    // 截取長(zhǎng)度,保留有用的數(shù)據(jù)
    imagePoints.resize(nimages);

    // 填充3d數(shù)據(jù)
    objectPoints.resize(nimages);
    for(int i = 0; i < nimages; i++ )
    {
        for(int j = 0; j < boardSize.height; j++ )
            for(int k = 0; k < boardSize.width; k++ )
                objectPoints[i].push_back(Point3f(k*squareSize, j*squareSize, 0));
    }

    cv::Mat cameraMatrix(3, 3, CV_32FC1, cv::Scalar::all(0));  //內(nèi)參矩陣3*3
    cv::Mat distCoeffs(1, 5, CV_32FC1, cv::Scalar::all(0));    //畸變矩陣1*5
    vector<cv::Mat> rotationMat;                               //旋轉(zhuǎn)矩陣
    vector<cv::Mat> translationMat;                            //平移矩陣

    //!標(biāo)定
    /**
     * points3D_all_images: 真實(shí)三維坐標(biāo)
     * points_all_images: 提取的角點(diǎn)
     * image_size: 圖像尺寸
     * camera_K : 內(nèi)參矩陣K
     * distCoeffs: 畸變參數(shù)
     * rotationMat: 每個(gè)圖片的旋轉(zhuǎn)向量
     * translationMat: 每個(gè)圖片的平移向量
     * */
    calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rotationMat, translationMat, 0);


    Mat testImg = imread(imageList[0], IMREAD_COLOR);


    cv::Rect validROI;
    Mat newCamMatrix = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1.0, imageSize, &validROI);

//    Mat undistortedImg;
//    undistort(testImg, undistortedImg, cameraMatrix, distCoeffs, newCamMatrix);

//    cv::rectangle(undistortedImg, validROI, Scalar(255, 0, 0));
//    imshow("undistorted image", undistortedImg);


    Mat undistortedImg2;
    Mat map1, map2;
    initUndistortRectifyMap(cameraMatrix, distCoeffs, cv::Mat(), newCamMatrix, imageSize, CV_32FC1, map1, map2);

    //    cout << "map1 size" << map1.size() << "," << map1.channels() << endl;
    //    cout << "map2 size" << map2.size() << "," << map2.channels() << endl;

    remap(testImg, undistortedImg2, map1, map2, INTER_LINEAR);
    cv::rectangle(undistortedImg2, validROI, Scalar(255, 0, 0));
    cout << "calibration completed\r\n";

    // map1 map2中存儲(chǔ)的分別是最終圖像對(duì)應(yīng)像素的x,y坐標(biāo)
    // 知道dst的坐標(biāo),求src的相應(yīng)坐標(biāo)
    Point dstPt(400, 109);
    double pt_x = map1.at<float>(dstPt);
    double pt_y = map2.at<float>(dstPt);
    cout << "dstPt:" << dstPt << "; " << "origin pt:" << pt_x << ", "<< pt_y << endl;
    cv::circle(testImg, Point(pt_x, pt_y), 5, Scalar(255, 0, 0), 2);
    cv::circle(undistortedImg2, dstPt, 5, Scalar(255,0, 0), 2);


    // 知道src的坐標(biāo),求dst的相應(yīng)坐標(biāo)
    vector<Point2f> srcPts;
    srcPts.push_back(Point2f(300, 145));
    vector<Point2f> dstPts;
    undistortPoints(srcPts, dstPts, cameraMatrix, distCoeffs, Mat(), newCamMatrix);
    cout << "the dst:" << dstPts << endl;
    circle(testImg, srcPts[0], 8, Scalar(0, 255, 0));
    circle(undistortedImg2, dstPts[0], 8, Scalar(0, 255, 0));
    imshow("src to dst: src", testImg);
    imshow("src to dst: dst", undistortedImg2);
}


參考:
【關(guān)于OpenCV中的去畸變】
【用OpenCV進(jìn)行相機(jī)標(biāo)定(張正友標(biāo)定,有代碼)】
【《opencv學(xué)習(xí)筆記》-- 重映射】文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-625479.html

到了這里,關(guān)于opencv對(duì)相機(jī)進(jìn)行畸變校正,及校正前后的坐標(biāo)對(duì)應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 相機(jī)的畸變矯正與opencv代碼說(shuō)明

    相機(jī)的畸變矯正與opencv代碼說(shuō)明

    圖像算法中會(huì)經(jīng)常用到攝像機(jī)的畸變校正,有必要總結(jié)分析OpenCV中畸變校正方法,其中包括普通針孔相機(jī)模型和魚(yú)眼相機(jī)模型fisheye兩種畸變校正方法。普通相機(jī)模型畸變校正函數(shù)針對(duì)OpenCV中的cv::initUndistortRectifyMap(),魚(yú)眼相機(jī)模型畸變校正函數(shù)對(duì)應(yīng)OpenCV中的cv::fisheye::initUndi

    2024年02月14日
    瀏覽(25)
  • 【相機(jī)標(biāo)定】opencv python 標(biāo)定相機(jī)內(nèi)參時(shí)不計(jì)算 k3 畸變參數(shù)

    畸變參數(shù) k3 通常用于描述徑向畸變的更高階效應(yīng),即在需要高精度的應(yīng)用中可以用到,一般的應(yīng)用中 k1, k2 足矣。 常見(jiàn)的應(yīng)用中, orbslam3 中是否傳入 k3 是可選的,而 kalibr 標(biāo)定中則只需要傳入 k1, k2 。但計(jì)算 k3 時(shí)的 k1, k2 不等于不計(jì)算 k3 時(shí)的 k1, k2 ,因此需要學(xué)會(huì)兩種場(chǎng)景下

    2024年02月09日
    瀏覽(32)
  • OpenCV開(kāi)發(fā)筆記(七十七):相機(jī)標(biāo)定(二):通過(guò)棋盤(pán)標(biāo)定計(jì)算相機(jī)內(nèi)參矩陣矯正畸變攝像頭圖像

    OpenCV開(kāi)發(fā)筆記(七十七):相機(jī)標(biāo)定(二):通過(guò)棋盤(pán)標(biāo)定計(jì)算相機(jī)內(nèi)參矩陣矯正畸變攝像頭圖像

    若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位讀者,知識(shí)無(wú)窮而人力有窮,要么改需求,要么找專(zhuān)業(yè)人士,要么自己研究 紅胖子(紅模仿)的博文大全:開(kāi)發(fā)技術(shù)集合(包含Qt實(shí)用技術(shù)、樹(shù)莓派、三維、OpenCV、OpenGL、

    2024年03月13日
    瀏覽(32)
  • 全景圖像畸變校正

    全景圖像畸變校正

    理想的相機(jī)基本上是小孔成像的,在小孔成像模型中,如果焦距一定,那么圖像傳感器像素平面的面積直接決定了相機(jī)視場(chǎng)角的大小,超過(guò)這個(gè)視場(chǎng)角范圍的物體不會(huì)被鏡頭獲取到。因此基于透鏡成像原理的相機(jī),視場(chǎng)角無(wú)法做到足夠大,水平視場(chǎng)角一般小于140°。 但是在一

    2024年02月09日
    瀏覽(22)
  • Matlab 校正鏡頭畸變圖像

    Matlab 校正鏡頭畸變圖像

    生活中一些針孔相機(jī)會(huì)給圖像帶來(lái)嚴(yán)重的失真,這主要是由于硬件和環(huán)境的因素所示導(dǎo)致的,其中主要的兩種畸變是徑向畸變和切向畸變。 徑向畸變會(huì)導(dǎo)致直線看起來(lái)彎曲,即點(diǎn)距離圖像中心越遠(yuǎn),徑向畸變就越大。例如,下面顯示了一張圖像,其中棋盤(pán)的兩個(gè)邊緣標(biāo)有紅線

    2024年02月11日
    瀏覽(21)
  • micropython 自制數(shù)碼相機(jī)

    像頭(CAMERA或WEBCAM)又稱(chēng)為電腦相機(jī)、電腦眼、電子眼等,是一種視頻輸入設(shè)備,被廣泛的運(yùn)用于視頻 會(huì)議,安防系統(tǒng)??、圖像采集系統(tǒng)、?環(huán)境監(jiān)控?、工業(yè)現(xiàn)場(chǎng)過(guò)程控制?等方面。本實(shí)驗(yàn)用TPYBoard? v102以 及PTC06?串口攝像頭模塊DIY一個(gè)簡(jiǎn)易的照相機(jī)。 1.所用器材: ??? TPY

    2024年02月19日
    瀏覽(21)
  • 如何從數(shù)碼相機(jī)恢復(fù)已刪除的照片?

    如何從數(shù)碼相機(jī)恢復(fù)已刪除的照片?

    “嗨,我刪除了索尼數(shù)碼相機(jī)中的所有照片。有什么辦法可以讓他們回來(lái)嗎?” ——?jiǎng)P 我們經(jīng)常從數(shù)碼相機(jī)中刪除照片。但是,如果我們誤刪除了一些重要的照片,則很難將其恢復(fù),因?yàn)閯h除的照片可能會(huì)繞過(guò)回收站或垃圾箱,并且數(shù)碼相機(jī)存儲(chǔ)卡中沒(méi)有“最近刪除”文

    2024年04月09日
    瀏覽(22)
  • opencv實(shí)現(xiàn)圖像去畸變——幾種實(shí)現(xiàn)方式(含完整代碼)&&效果對(duì)比圖&&詳細(xì)參數(shù)說(shuō)明&&核心參數(shù)變化對(duì)應(yīng)變化效果圖&&常見(jiàn)問(wèn)題

    opencv實(shí)現(xiàn)圖像去畸變——幾種實(shí)現(xiàn)方式(含完整代碼)&&效果對(duì)比圖&&詳細(xì)參數(shù)說(shuō)明&&核心參數(shù)變化對(duì)應(yīng)變化效果圖&&常見(jiàn)問(wèn)題

    以下介紹下opencv實(shí)現(xiàn)圖像去畸變的幾種方式以及詳細(xì)參數(shù)說(shuō)明,含項(xiàng)目案例,含擴(kuò)展的相關(guān)知識(shí) ① cv::fisheye::initUndistortRectifyMap?和 ② cv::initUndistortRectifyMap?都是?OpenCV?庫(kù)中的函數(shù),用于攝像機(jī)的畸變校正和圖像的矯正。二者的區(qū)別在于,cv::fisheye::initUndistortRectifyMap?適用于

    2024年02月10日
    瀏覽(301)
  • opencv相機(jī)坐標(biāo)到圖像坐標(biāo)的轉(zhuǎn)換

    相機(jī)坐標(biāo)到圖像坐標(biāo)的轉(zhuǎn)換通常需要使用相機(jī)內(nèi)參矩陣和外參矩陣。在OpenCV中,可以通過(guò)cv2.projectPoints()函數(shù)實(shí)現(xiàn)相機(jī)坐標(biāo)到圖像坐標(biāo)的轉(zhuǎn)換。具體的程序如下: 以上代碼中,讀取了一張圖像和相機(jī)參數(shù),使用cv2.projectPoints()函數(shù)進(jìn)行相機(jī)坐標(biāo)到圖像坐標(biāo)的轉(zhuǎn)換,最后在圖像上

    2024年02月11日
    瀏覽(16)
  • U盤(pán)/硬盤(pán)/數(shù)碼相機(jī)RAW格式文件丟失的原因|恢復(fù)方法

    在現(xiàn)代數(shù)字生活中,U盤(pán)、硬盤(pán)以及數(shù)碼相機(jī)等設(shè)備已經(jīng)成為我們儲(chǔ)存和分享數(shù)據(jù)的主要工具。然而,當(dāng)這些設(shè)備中的RAW格式文件出現(xiàn)丟失時(shí),我們可能會(huì)陷入困境。面對(duì)這種情況,了解如何恢復(fù)這些RAW格式文件就變得至關(guān)重要。 一、理解RAW格式文件 RAW格式文件是一種原始數(shù)

    2024年02月12日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包