上記の答えは複雑すぎてCPUを占有します。あなたの質問は恣意的な回転ではありませんでしたが、「Opencvマトリックスを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
など。ドキュメントから転置および反転操作を自己紹介することにより、他のコマンド(thinking = Learning)を自分で理解します。
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
任意の角度
で回転するここでは、任意の角度で回転する方法を説明します。これは、50倍の費用がかかると予想されます。この方法での回転には黒のパディングが含まれ、エッジは画像の元のサイズから外れるように回転されることに注意してください。
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には顔検出などのネイティブな機能があることは注目に値します(これは疑わしいパフォーマンスでは実際には維持されません)。顕著。
乾杯