ウェブカメラから画像をキャプチャしていますが、直角に回転させる必要があります。私はこれらの関数を見つけました:
getRotationMatrix2D
-回転行列を作成する(それが何であれ)transform
-回転行列によってある行列を別の行列に変換しますしかし、私は黒いエリア以外は何も得ません。これは私のコードです:
if(rotate_button.click%4>0) {
double angle = (rotate_button.click%4)*90; //button increments its click by 1 per click
Mat transform_m = getRotationMatrix2D(Point(cam_frame_width/2, cam_frame_height/2), angle, 1); //Creating rotation matrix
Mat current_frame;
transform(cam_frame, current_frame, transform_m); //Transforming captured image into a new one
cam_frame = Mat((int)current_frame.cols,(int)current_frame.rows, cam_frame_type) = Scalar(0,128,0); //resizing captured matrix, so I can copy the resized one on it
current_frame.copyTo(cam_frame); //Copy resized to original
}
黒画面のみを出力します。
WarpAffineを使用します。
試してください:
Point2f src_center(source.cols/2.0F, source.rows/2.0F);
Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0);
Mat dst;
warpAffine(source, dst, rot_mat, source.size());
dst
は最終画像です
上記の答えは複雑すぎて、CPUを浪費します。あなたの質問はarbitrary意的な回転ではなく、「Opencv Matrixを90度、180度、270度回転」です。
2017年6月30日更新:
この機能はOpenCVでサポートされていますが、文書化されていません: https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core.hpp#L1041
void rotate(InputArray src, OutputArray dst, int rotateCode);
と
enum RotateFlags {
ROTATE_90_CLOCKWISE = 0, //Rotate 90 degrees clockwise
ROTATE_180 = 1, //Rotate 180 degrees clockwise
ROTATE_90_COUNTERCLOCKWISE = 2, //Rotate 270 degrees clockwise
};
元の回答と任意の度の回転:
90CWの場合、フリップと転置操作を使用してこれを行うこともできます。
transpose(matSRC, matROT);
flip(matROT, matROT,1); //transpose+flip(1)=CW
など。ドキュメントから転置および反転操作を紹介して、他のコマンドを自分で考えてください(思考=学習)。
void rot90(cv::Mat &matImage, int rotflag){
//1=CW, 2=CCW, 3=180
if (rotflag == 1){
transpose(matImage, matImage);
flip(matImage, matImage,1); //transpose+flip(1)=CW
} else if (rotflag == 2) {
transpose(matImage, matImage);
flip(matImage, matImage,0); //transpose+flip(0)=CCW
} else if (rotflag ==3){
flip(matImage, matImage,-1); //flip(-1)=180
} else if (rotflag != 0){ //if not 0,1,2,3:
cout << "Unknown rotation flag(" << rotflag << ")" << endl;
}
}
したがって、このように呼び出し、マトリックスが参照渡しされることに注意してください。
cv::Mat matImage;
//Load in sensible data
rot90(matImage,3); //Rotate it
//Note if you want to keep an original unrotated version of
// your matrix as well, just do this
cv::Mat matImage;
//Load in sensible data
cv::Mat matRotated = matImage.clone();
rot90(matImage,3); //Rotate it
任意の角度で回転する私がそれに取り組んでいる間に、ここでは任意の角度で回転する方法を示します。この方法での回転には黒いパディングが含まれ、エッジは画像の元のサイズに合わせて回転することに注意してください。
void rotate(cv::Mat& src, double angle, cv::Mat& dst){
cv::Point2f ptCp(src.cols*0.5, src.rows*0.5);
cv::Mat M = cv::getRotationMatrix2D(ptCp, angle, 1.0);
cv::warpAffine(src, dst, M, src.size(), cv::INTER_CUBIC); //Nearest is too rough,
}
10.5度の回転に対してこれを呼び出すことは、明らかに次のとおりです。
cv::Mat matImage, matRotated;
//Load in data
rotate(matImage, 10.5, matRotated);
これらの種類の非常に基本的な機能はOpenCVの一部ではなく、OpenCVには顔検出などのネイティブな機能があります(パフォーマンスが疑わしいため、実際には維持されていません)。顕著。
乾杯
@Abhishek Thakurの答えは、画像を180度回転させる場合にのみ有効です。 90度の回転を処理しません
getRotationMatrix2D
に指定された回転の中心が正しくありません。warpAffline
に渡される出力行列サイズが正しくありません。画像を90度回転させるコードは次のとおりです。
Mat src = imread("image.jpg");
Mat dst;
double angle = 90; // or 270
Size src_sz = src.size();
Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows);
Point2f center(len/2., len/2.);
Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
warpAffine(src, dst, rot_mat, dst_sz);
Edit:別のアプローチ 画像を90、180、または270度回転するには、マトリックスtranspose
を実行してからflip
。この方法はおそらくより高速です。
上記のコードは正常に機能しますが、浮動小数点で行われる行列計算とwarpAffine補間のために、画像に数値誤差が生じます。
90度の増分回転の場合、次を使用することを好みます(python/opencv python)
PythonのOpenCV画像は2Dナンピー配列です。
90度.
theImage = numpy.rot90(theImage、1)
270度.
theImage = numpy.rot90(theImage、3)
注:これは、形状(X、Y)のグレースケールイメージでのみテストしました。カラー(または他のマルチセパレーション)画像がある場合、正しい軸に沿って回転が機能することを確認するために、最初に画像の形状を変更する必要がある場合があります。