getHomography と warpPerspective を使用して、画像を正面から見たビューに変更します。
画像は目的のパースペクティブにワープしますが、トリミングはオフになっています。歪んだ画像を画像ボックスの外に大きく移動します。その理由は、操作の結果が負の座標になるためだと思います。
チェス盤の関数が適切な点を検出できなかったため、opencv:s 関数を使用せずに、手動で変換行列を計算するための点を計算しました。
これは、変換マトリックスに追加の変更を加えることで修正できると思います。しかし、それはどのように行われますか?また、変換された画像がx軸に沿って中央に配置されていることを確認してから、y軸を目的の位置に調整する方法はありますか?
今仕事をするコードスニペット:
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);