我正在使用 OpenCV 尝试对该图像进行鸟瞰投影:
我首先找到棋盘的所有内角并绘制它们,如此处所示
然后我在其上使用 warpPerspective() 但它产生了一个非常小的扭曲图像如图所示。谁能弄清楚是什么原因造成的?
这是我的代码:
#include <ros/ros.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <vector>
using namespace cv ;
int main(int argc, char* argv[] ) {
ros::init( argc, argv, "bird_view" ) ;
int board_w = atoi(argv[1]);
int board_h = atoi(argv[2]);
cv::Size board_sz( board_w, board_h );
cv::Mat image = cv::imread( "image.jpg" ) ;
cv::Mat gray_image, tmp, H , birds_image;
cv::Point2f objPts[4], imgPts[4] ;
std::vector<cv::Point2f> corners ;
float Z = 1 ; //have experimented from values as low as .1 and as high as 100
int key = 0 ;
int found = cv::findChessboardCorners( image, board_sz, corners ) ;
if (found) {
cv::drawChessboardCorners(image, board_sz, corners, 1) ;
cvtColor( image, gray_image, CV_RGB2GRAY ) ;
cornerSubPix( gray_image, corners, Size(11, 11), Size(-1, -1),
TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1) ) ;
cv::resize( image, tmp, Size(), .5, .5 ) ;
namedWindow( "IMAGE" ) ;
cv::imshow( "IMAGE" , tmp ) ;
waitKey(0) ;
}
objPts[0].x = 0 ;
objPts[0].y = 0 ;
objPts[1].x = board_w-1 ;
objPts[0].y = 0 ;
objPts[0].x = 0 ;
objPts[0].y = board_h-1 ;
objPts[0].x = board_w-1 ;
objPts[0].y = board_h-1 ;
imgPts[0] = corners.at(0) ;
imgPts[1] = corners.at(board_w-1) ;
imgPts[2] = corners.at((board_h-1) * board_w) ;
imgPts[3] = corners.at((board_h-1) * board_w + board_w-1) ;
H = cv::getPerspectiveTransform( objPts, imgPts ) ;
birds_image = image ;
while ( key != 27 ) {
H.at<float>(2,2) = Z ;
cv::warpPerspective( image, birds_image, H, Size( 2 * image.cols, 2 * tmp.rows ) ,
CV_INTER_LINEAR | CV_WARP_INVERSE_MAP | CV_WARP_FILL_OUTLIERS ) ;
cv::imshow( "IMAGE", birds_image ) ;
cv::waitKey(0) ;
}
return 0 ;
}
所有这些代码都基于 O'Reilly 的 OpenCV 书的鸟瞰投影示例。我认为生成的图片是正确的,但在我确定之前我不确定。