Как получить трансформацию камеры из проекции камеры без искажений? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть рамка проекции камеры, и я хочу преобразовать ее до определенного c разрешения. Мои шаги:

  • Калибровка камеры
#define CALIB_BOARD_WIDTH     9
#define CALIB_BOARD_HEIGHT    5

 void calibrateCamera(string fileName){
    Mat matFrame = imread(fileName);
    Mat matGrayFrame; 
    cvtColor(matFrame, matGrayFrame, CV_BGR2GRAY);

    Size sizeBoard = Size(CALIB_BOARD_WIDTH, CALIB_BOARD_HEIGHT);

    vector<Point2f> v2fCorners;

    bool bFound = findChessboardCorners(matGrayFrame, sizeBoard, v2fCorners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);

    cornerSubPix(matGrayFrame,
        v2fCorners,
        cvSize(11, 11),
        cvSize(-1, -1),
        TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 40, 0.001)
    );
}
  • получить перспективное преобразование
void getPerspeciveTransform(Mat &m,const vector<Point2f> &v2fCorners)
{
    Point2f apt2d32fObject[4];
    Point2f apt2d32fImage[4];

    int nFrameWidth = 1920;
    int nFrameHeight = 1200;

    apt2d32fObject[0].x = 0;
    apt2d32fObject[0].y = 0;
    apt2d32fObject[1].x = nFrameWidth;
    apt2d32fObject[1].y = 0;
    apt2d32fObject[2].x = 0;
    apt2d32fObject[2].y = nFrameHeight;
    apt2d32fObject[3].x = nFrameWidth;
    apt2d32fObject[3].y = nFrameHeight;

    int nIndexTL = 0;
    int nIndexTR = CALIB_BOARD_WIDTH - 1;
    int nIndexBL = (CALIB_BOARD_HEIGHT - 1) * CALIB_BOARD_WIDTH;
    int nIndexBR = (CALIB_BOARD_HEIGHT - 1) * CALIB_BOARD_WIDTH + CALIB_BOARD_WIDTH - 1;

    // v2fCorners are points that are found by findChessboardCorners.
    apt2d32fImage[0] = v2fCorners[nIndexTL];
    apt2d32fImage[1] = v2fCorners[nIndexTR];
    apt2d32fImage[2] = v2fCorners[nIndexBL];
    apt2d32fImage[3] = v2fCorners[nIndexBR];

    m = getPerspectiveTransform(apt2d32fObject, apt2d32fImage);
}
  • Преобразование точек
Point2f getConvertedPoint(Mat m, Point2f point){
    Point2f pt2fRet;
    pt2fRet.x = -9999;
    pt2fRet.y = -9999;

    if (m.empty())
    {
        return pt2fRet;
    }

    Mat matHomInvt(m);

    std::vector<Point2f> vPt2fSrcPoints;
    vPt2fSrcPoints.push_back(pt2f);

    std::vector<Point2f> vPt2fDstPoints;

    perspectiveTransform(vPt2fSrcPoints, vPt2fDstPoints, matHomInvt);

    Point2f pt2fTransformed = vPt2fDstPoints.at(0);

    pt2fRet.x = pt2fTransformed.x;
    pt2fRet.y = pt2fTransformed.y;

    return pt2fRet;
}

Я вызвал функцию getConvertedPoint () , чтобы преобразовать все возможные точки. И нарисуйте точки на экране. Я понимаю, что у меня есть небольшие искажения, и я не могу понять. Есть ли какой-нибудь совет?

Калибровка изображения Точки на экране (уменьшено 1:10)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...