std::vector<std::vector<cv::Point>> contours;
cv::findContours(Img, contours, 0, 2);
cv::RotatedRect rotatedrect = minAreaRect(contours[i]);
double angle = rotaterect.angle;
cv::Point2f center = rotaterect.center;
cv::Mat M = cv::getRotationMatrix2D(center, angle, 1);//取得旋转矩阵
warpAffine(Img, Img, M, cv::Size(Img.cols, Img.rows));//未扩大的进行旋转
opencv 图像平移
cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);
M.at<float>(0, 0) = 1;
M.at<float>(0, 2) = 0; //水平平移量
M.at<float>(1, 1) = 1;
M.at<float>(1, 2) = 0; //竖直平移量
cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000));//图像尺寸扩张Size(500,1000)(默认扩张方式)
//用固定颜色填充扩张的边界
//cv::Scalar borderColor = Scalar(255, 255, 255);
//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_CONSTANT, borderColor);
//复制边缘填充
//cv::warpAffine(temp, temp, M, temp.size() + cv::Size(500, 1000), 1, BORDER_REPLICATE);
关于大M矩阵:
对平移矩阵:
M=[ [scale , 0 , a] //a水平平移量
[0 , scale , b] ] //b竖直平移量
对旋转矩阵:
M=[ [scale*cos(angle) , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y ]
[-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y ] ]
//scale缩放因子,1表示不进行缩放
//angle旋转角度,正值表示逆时针旋转
//center图像旋转的中心位置
旋转和平移结合:
M=[ [scale*cos(angle) , scale*sin(angle) , (1-scale*cos(angle))*center.x-scale*sin(angle)*center.y + a]
[-scale*sin(angle) , scale*cos(angle) , scale*sin(angle)*center.x+(1-scale*cos(angle))*center.y + b] ]
#include
#include
#include
using namespace std;
using namespace cv;
int main() {
string path = R"(circle.png)";
cv::Mat Img = imread(path, IMREAD_GRAYSCALE);
cv::threshold(Img, Img, 200, 255, 0);
cv::Mat M = cv::Mat::zeros(2, 3, CV_32FC1);
double scale = 1;//缩放因子,1表示不进行缩放
double angle = 60.0 / 180.0 * CV_PI;//旋转角度,正值表示逆时针旋转
cv::Point2f center = cv::Point2f(Img.cols / 2.0, Img.rows / 2.0);//图像旋转的中心位置
double a = 0;//水平平移量
double b = 100;//竖直平移量
M.at<float>(0, 0) = scale * cos(angle);
M.at<float>(0, 1) = scale * sin(angle);
M.at<float>(1, 0) = -1 * M.at<float>(0, 1);
M.at<float>(1, 1) = M.at<float>(0, 0);
M.at<float>(0, 2) = (1 - M.at<float>(0, 0))*center.x - M.at<float>(0, 1)*center.y + a;
M.at<float>(1, 2) = M.at<float>(0, 1)*center.x + (1 - M.at<float>(0, 0))*center.y + b;
cv::Mat Img_R;
cv::warpAffine(Img, Img_R, M, Img.size() + cv::Size(0, 100));//逆时针旋转angle度即是逆时针旋转60度
waitKey(0);
return 0;
}