【发布时间】:2014-04-08 20:08:18
【问题描述】:
我正在使用 getHomography 和 warpPerspective 将图像从正面视角更改为投标视角。
它的工作原理是图像扭曲到所需的视角,但裁剪已关闭。它将扭曲的图像大部分移到图像框之外。我认为原因是因为操作导致负坐标。
我已经手动计算了用于计算平移矩阵的点,而不是使用任何 opencv:s 函数来计算,因为即棋盘函数未能检测到正确的点。
我想这可以通过对转换矩阵进行额外的更改来解决。但是这是怎么做到的呢?另外,有没有办法确保转换后的图像沿x轴居中,然后让y轴调整到所需的位置?
现在可以完成这项工作的代码 sn-p:
cv::Mat image; // image is loaded with the original image
cv::Mat warpPers; // The container for the resulting image
cv::Mat H;
std::vector<cv::Point2f> src;
std::vector<cv::Point2f> dst;
// In reality several more points.
src.push_back(cv::Point2f(264,301));
src.push_back(cv::Point2f(434,301));
src.push_back(cv::Point2f(243,356));
src.push_back(cv::Point2f(476,356));
dst.push_back(cv::Point2f(243,123));
dst.push_back(cv::Point2f(476,123));
dst.push_back(cv::Point2f(243,356));
dst.push_back(cv::Point2f(476,356));
H = cv::findHomography(src, dst, CV_RANSAC);
cv::warpPerspective(image,
newPers,
H,
cv::Size(3000,3000),
cv::INTER_NEAREST | CV_WARP_FILL_OUTLIERS
);
cv::namedWindow("Warped persp", cv::WINDOW_AUTOSIZE );
cv::imshow( "Warped persp", newPers);
【问题讨论】:
-
您可以手动转换图像的边界点
cv::Point2f(0,0)``cv::Point2f(image.cols, 0)``cv::Point2f(image.cols, image.rows)cv::Point2f(0, image.rows)(与您的单应性进行多重播放)并检查它们是否适合您的 3000,3000 大小的 dst 图像。计算它们的最小/最大位置并相应地修改单应性的平移部分和/或比例(或 dst 图像大小)。不过,我没有检查您的其余代码是否正常;) -
@Einar 如果你想让
findHomography函数完成这项工作,你必须仔细定义你的目标点,以便扭曲的图像与你的需要相对应。但是,在扭曲图像之前使用自定义翻译(如 Micka 所说)组成单应性并没有什么错。
标签: c++ opencv image-processing perspectivecamera