我正在使用OpenCV 2.2。
如果我使用cvFindChessboardCorners
查找棋盘的角落,角落存储在变量corners
中的角度是什么(例如,首先是左上角,然后是行然后是列)?
Documentation(没有多大帮助)。
答案 0 :(得分:0)
我很确定它按行排列棋盘角落,从最靠近图像左上角的角落开始。
棋盘图案没有指定的原点(该校准装置的缺陷之一),所以如果你将它转过90度或180度,你回来的角落将不会是相同的顺序。
确保的方法是查看您获得的实际积分值,看看它们是否符合预期。
编辑:至少在OpenCV 3.3.1和5x3棋盘的情况下,棋盘角可以从左上角或右下角开始返回,具体取决于旋转。
答案 1 :(得分:0)
在我看来,该文档缺少此类细节。
对于3.2.0-dev,在我看来,这取决于棋盘的旋转角度。 这段代码:
cv::Size patternsize(4,3); //number of centers
cv::Mat cal = cv::imread(cal_name);
std::vector<cv::Point2f> centers; //this will be filled by the detected centers
bool found = cv::findChessboardCorners( cal, patternsize, centers, cv::CALIB_CB_ADAPTIVE_THRESH );
std::cout << found << "\n";
if(found){
cv::drawChessboardCorners(cal,patternsize,centers,found);
您将获得以下结果:
请注意
由与线相连的彩色角
drawChessboardCorners
绘制的,它们的区别仅在于颜色:在原始图像中,红线在底部,在旋转图像中,红线在图像的顶部。
如果您将drawChessboardCorners
的灰度图像传递给您,则会丢失这些信息。
如果我需要图片左上角的第一个角,并且可以假设:
然后,以下代码段将根据需要对角进行重新排序:
cv::Size patternsize(4,3); //number of centers
cv::Mat cal = cv::imread(cal_name);
std::vector<cv::Point2f> centers; //this will be filled by the detected centers
bool found = cv::findChessboardCorners( cal, patternsize, centers, cv::CALIB_CB_ADAPTIVE_THRESH );
std::cout << found << "\n";
if(found){
cv::drawChessboardCorners(cal,patternsize,centers,found);
// I need the first corner at top-left
if(centers.front().y > centers.back().y){
std::cout << "Reverse order\n";
std::reverse(centers.begin(),centers.end());
}
for(size_t r=0;r<patternsize.height;r++){
for(size_t c=0;c<patternsize.width;c++){
std::ostringstream oss;
oss << "("<<r<<","<<c<<")";
cv::putText(cal, oss.str(), centers[r*patternsize.width+c], cv::FONT_HERSHEY_PLAIN, 3, CV_RGB(0, 255, 0), 3);
}
}
}