6

既知のサイズの要素を持つ画像の傾きを補正しようとしています。この画像を考えると:

ソース画像

aruco:: estimatePoseBoard回転ベクトルと並進ベクトルを返すを使用できます。その情報を使用して、マーカー ボードと同じプレーンにあるすべてのものをデスキューする方法はありますか? (残念ながら、私の線形代数はせいぜい初歩的なものです。)

明確化

マーカーボードの傾きを調整する方法を知っています。私ができるようにしたいのは、マーカー ボードと同じ平面にある他のもの (この場合は雲の形をしたオブジェクト) の傾きを調整することです。私はそれが可能かどうかを判断しようとしています。デスキューしたいオブジェクトの周りに 4 つのマーカーを配置し、検出されたコーナーをgetPerspectiveTransformそれらの間の既知の距離と共に入力として使用することができます。しかし、実際のアプリケーションでは、ユーザーがマーカーを正確に配置するのは難しい場合があります。フレーム内に 1 つのマーカー ボードを配置し、ソフトウェアで他のオブジェクトの傾きを補正できれば、はるかに簡単になります。

4

2 に答える 2

2

OpenCV にタグを付けてから: 画像から、すべてのブラック ボックスの角を検出したことがわかります。したがって、何らかの方法でポイントの境界を最大限に取得するだけです。 ここに画像の説明を入力

次に、次のようになります。

std::vector<cv::Point2f> src_points={/*Fill your 4 corners here*/};
std::vector<cv::Point2f> dst_points={cv:Point2f(0,0), cv::Point2f(width,0), cv::Point2f(width,height),cv::Point2f(0,height)}; 
auto H=v::getPerspectiveTransform(src_points,dst_points);
cv::Mat copped_image;
cv::warpPerspective(full_image,copped_image,H,cv::Size(width,height));
于 2016-01-29T08:41:53.343 に答える
1

への呼び出しの宛先ポイントは、出力画像のコーナーでなければならないという仮定に固執してgetPerspectiveTransformいました(Humamの提案にあるように)。宛先ポイントが出力画像内のどこかにある可能性があることに気づいたら、答えがわかりました。

float boardX = 1240;
float boardY = 1570;
float boardWidth = 1730;
float boardHeight = 1400;

vector<Point2f> destinationCorners;
destinationCorners(Point2f(boardX+boardWidth, boardY));
destinationCorners(Point2f(boardX+boardWidth, boardY+boardHeight));
destinationCorners(Point2f(boardX, boardY+boardHeight));
destinationCorners(Point2f(boardX, boardY));

Mat h = getPerspectiveTransform(detectedCorners, destinationCorners);

Mat bigImage(image.size() * 3, image.type(), Scalar(0, 50, 50));

warpPerspective(image, bigImage, h, bigImage.size());

これにより、ボードとその平面内のすべての視点が修正されました。(ボードのうねりは、元の写真では紙が平らに置かれていないためです。)

修正されたパースペクティブ

于 2016-02-17T01:57:18.320 に答える