8

画像があり、画像に長方形を配置します。次に、画像を回転させます。回転した画像の長方形の中心を取得するにはどうすればよいですか?

または、何らかの形で長方形を回転させて、回転した画像を表示できますか? この場合、画像の回転に使用されるポイントと同じポイントに沿って回転を行う必要があると思います。

その上に長方形を置いた画像です。

ここに画像の説明を入力

回転した画像です。

ここに画像の説明を入力

画像を回転させるために使用するコードは次のとおりです。

cv::Mat frame, frameRotated;
frame = cv::imread("lena.png");

cv::Rect rect(225,250,150,150);
cv::rectangle(frame, rect, cv::Scalar(0,0,255),2);

int theta = 30;
double radians = theta * PI / 180.0;            

double sin = abs(std::sin(radians));
double cos = abs(std::cos(radians));

int newWidth = (int) (frame.cols * cos + frame.rows * sin);
int newHeight = (int) (frame.cols * sin + frame.rows * cos);

cv::Mat targetMat(cv::Size(newWidth, newHeight), frame.type());

int offsetX = (newWidth - frame.cols) / 2;
int offsetY = (newHeight - frame.rows) / 2;

frame.copyTo(targetMat.rowRange(offsetY, offsetY + frame.rows).colRange(offsetX, offsetX + frame.cols));

cv::Point2f src_center(targetMat.cols/2.0F, targetMat.rows/2.0F);
cv::Mat rot_mat = cv::getRotationMatrix2D(src_center, theta, 1.0);
cv::warpAffine(targetMat, frameRotated, rot_mat, targetMat.size());

imshow("frame", frame); 
imshow("rotated frame", frameRotated);  

編集

回転した画像に点があるとします。回転行列を使用して元の画像に対応する点を取得するにはどうすればよいですか?

4

3 に答える 3

2

rot_mat を使用して、四角形の元の中心を変換するだけです。以下をテストしましたが、動作します:

cv::Rect r(250, 350, 20, 30);
cv::Point2d c(r.x + r.width / 2, r.y + r.height / 2);
// c is center of rect

// get c's location in targetMat when frame is copied
c.x += offsetX;  
c.y += offsetY;


int theta = 30;
double radians = theta * M_PI / 180.0;            

cv::Point2d src_center(targetMat.cols/2.0F, targetMat.rows/2.0F);
cv::Mat rot_mat = cv::getRotationMatrix2D(src_center, theta, 1.0);

// now transform point using rot_mat
double *x = rot_mat.ptr<double>(0);
double *y = rot_mat.ptr<double>(1);
Point2d dst(x[0] * c.x + x[1] * c.y + x[2], 
            y[0] * c.x + y[1] * c.y + y[2]);
// dst is center of transformed rect

編集

回転した画像からポイントを変換するには、プロセスを逆にする必要があります。

// undo translation
Point2d dst1(dst.x - x[2], dst.y - y[2]); 

// undo rotation
Point2d dst2(x[0] * dst1.x - x[1] * dst1.y, -y[0] * dst1.x + y[1] * dst1.y); 

// undo shift
Point2d in_unrotated_image(dst2.x - offsetX, dst2.y - offsetY); 
于 2013-11-06T01:13:00.303 に答える
0

2番目の質問で問題を解決しました。

受け入れられた回答で提供されたのと同じコードを使用し、マイナス シータで回転行列を作成しました。

于 2013-11-06T12:00:03.813 に答える