У меня есть рамка проекции камеры, и я хочу преобразовать ее до определенного 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)