使用旋转矩阵:
R(-t) = [cos(t) sin(t)]
[-sin(t) cos(t)]
其中 t = 以弧度表示的角度
函数表示为:
[x] = [cos(t) sin(t)][x]
[y] [-sin(t) cos(t)][y]
或者
x' = x * cos(t) + y * sin(t)
y' = -x * sin(t) + y * cos(t)
我正在将二维矩阵顺时针旋转 30 度,尺寸为 150x150。
在代码中它看起来像这样:
cv::Mat m = cv::Mat::zeros(150, 150, CV_8UC1);
cv::Mat nm = cv::Mat::zeros(150, 150, CV_8UC1);
cv::rectangle(m, cv::Rect(0,0,150,150), cv::Scalar(100,100,100),-1);
double rad = (30.0 * M_PI/180.0);
for (int c = 0; c < m.cols;c++){
for (int r = 0; r < m.rows;r++){
int x = (m.cols*0.5)-c;
int y = (m.rows*0.5)-r;
int xn = (x*cos(rad) + y*sin(rad));
int yn = (-x*sin(rad) + y*cos(rad));
xn += (m.cols*0.5);
yn += (m.rows*0.5);
if (xn<0||xn>=m.cols||yn<0||yn>=m.rows){
continue;
}
nm.at<uchar>(xn,yn)=m.at<uchar>(c,r);
}
}
从数学上看,它看起来是正确的,但这些是我得到的结果
未旋转的矩阵:
旋转矩阵:
旋转的矩阵出现颗粒状。这是什么原因造成的?它是如何固定的?我更喜欢数学上的解释。
PS。请不要指向opencv的预煮方法,我知道它们存在。