我想出了那个代码,用于旋转图像而不裁剪图像。 它只是更改目标图像的大小,以避免切掉角点:
实际的rotate.cpp
代码:
int diagonal = (int)sqrt(src.cols*src.cols+src.rows*src.rows);
int newWidth = diagonal;
int newHeight = diagonal;
cv::Mat container = cv::Mat::zeros(newWidth, newHeight, src.type());
int offsetX = (newWidth - src.cols) / 2;
int offsetY = (newHeight - src.rows) / 2;
src.copyTo(container.rowRange(offsetY, offsetY + src.rows).colRange(offsetX, offsetX + src.cols));
dst = container.clone();
float rads = angle*3.1415926/180.0;
float _cos = cos(-rads);
float _sin = sin(-rads);
float xcenter = (float)(container.cols)/2.0;
float ycenter = (float)(container.rows)/2.0;
for(int i = 0; i < container.rows; i++)
for(int j = 0; j < container.cols; j++){
int x = ycenter + ((float)(i)-ycenter)*_cos - ((float)(j)-xcenter)*_sin;
int y = xcenter + ((float)(i)-ycenter)*_sin + ((float)(j)-xcenter)*_cos;
if (x >= 0 && x < container.rows && y >= 0 && y < container.cols) {
for (int k = 0; k < 4; k++)
dst.at<cv::Vec4b>(i,j)[k] = container.at<cv::Vec4b>(x, y)[k];
}
else {
dst.at<cv::Vec4b>(i,j)[3] = 0;
}
}
cv::imshow("dst", dst);
最后的imshow
函数仅用于检查结果,并根据此屏幕截图(忽略色差,Qt读取RGBA
的{{1}}和imshow
的{{1}} ):
如您所见,应用程序内的Label似乎没有受到影响,BGR
从imshow
函数运行,与label相同(updateUi
updateUi
通知了observer
,并且从model
函数内部启动的imshow
正在正确显示旋转的图像。
现在,在达到这一点之前,我的算法是:
Rotation
,它完美地显示在我的Qt标签上(当然是角落)。 现在,我的想法是
float rads = angle*3.1415926/180.0;
float _cos = cos(-rads);
float _sin = sin(-rads);
float xcenter = (float)(src.cols)/2.0;
float ycenter = (float)(src.rows)/
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++){
int x = ycenter + ((float)(i)-ycenter)*_cos - ((float)(j)-xcenter)*_sin;
int y = xcenter + ((float)(i)-ycenter)*_sin + ((float)(j)-xcenter)*_cos;
if (x >= 0 && x < src.rows && y >= 0 && y < src.cols) {
dst.at<cv::Vec4b>(i,j) = src.at<cv::Vec4b>(x, y);
}
else {
dst.at<cv::Vec4b>(i,j)[3] = 0;
}
我尝试了已经不同的更改,例如使用另一个Mat obj,最后进行了
...code...
dst = container.clone();
...code...
,但看来我的rotatedMat.copyTo(dst);
or...
dst = rotatedMat.clone();
垫在模型中没有改变。
当然,我通过引用我的所有函数来传递dst
和src
。
答案 0 :(得分:0)
经过一些测试,似乎Mat objs上的每个resize / clone / copy函数都会在克隆/复制之前取消分配内存... / ...这就是为什么对DST的引用无效的原因。 解决方法:只需在函数调用外部调整dst矩阵的大小即可。