opencv图片旋转后图片无法填满窗口有黑边解决方法

opencv图片旋转: 先找到图片的中心点,再根据中心点旋转角度,img为获取的图片,rotateImg为旋转后的图片。


cv::Mat img;
cv::Point2f center = cv::Point2f(img.cols / 2, img.rows / 2);  // 旋转中心  
double angle = 270;  // 旋转角度  
double scale = 1; // 缩放尺度  
cv::Mat rotateMat;
rotateMat = cv::getRotationMatrix2D(center, angle, scale);
cv::Mat rotateImg;
cv::warpAffine(img, rotateImg, rotateMat, img.size());


以上是旋转的代码,一般窗口显示图片经过旋转后,比如以上旋转270度后,窗口上除了图片外的区域默认是黑色填充,即为黑边。
有黑边的窗口影响查看图片,现在需要将黑边去掉,让图片充满窗口。
法一,将摄像头分辨率设置到比窗口宽高还大,从获取到的图片中截取窗口宽高大小一样的图片
法二:根据窗口宽高获得窗口相对图片的最大比例(但缩放后的宽高比图片宽高小),再从图片中截取窗口相应比例的图片出来放大显示到窗口。如此会有一个情况是图片是经过放大显示。
/*
比如:窗口是w1=800,h1=600
图片是w2=640,h2=480
则最大缩放比例是2,从图片中截取出图片大小为:w1/2=400, h1/2=300
获取窗口的最大缩放比例,再从图片中截取出该最大比例对应的图片,再放大来适应窗口
*/


cv::Mat cutImg;
int dw = g_rect.Width(), dh = g_rect.Height();
int imgw = rotateImg.cols, imgh = rotateImg.rows;
if (imgw >= dw && imgh >= dh)  //法一
{
// 直接截取
cutImg = rotateImg(cv::Rect((imgw-dw)/2, (imgh-dh)/2, dw, dh));
}
else  // 法二
{
/*
比如:窗口是w1=800,h1=600
图片是w2=640,h2=480
则最大缩放比例是2,从图片中截取出图片大小为:w1/2=400, h1/2=300
获取窗口的最大缩放比例,再从图片中截取出该最大比例对应的图片,用以适应窗口
*/
// 缩放再截取
static int cutScale = 0;
if (cutScale == 0)
{
cutScale = GetImgToWndScale(dw, dh, imgw, imgh);
}
if (cutScale != 0)
{
// 取得缩放后在原图中截取的位置
int x = (imgw - dw / cutScale) / 2;
int y = (imgh - dh / cutScale) / 2;
int w = dw / cutScale;
int h = dh / cutScale;
cutImg = rotateImg(cv::Rect(x, y, w, h));
}
}

// 获取窗口的最大缩放比例,缩放后的长宽大小小于图片长宽大小
int GetImgToWndScale(int windw, int windh, int imgw, int imgh)
{
if (windw <= 0 || windh <= 0 || imgw <= 0 || imgh <= 0)
{
return 0;
}

int scale = 1;
while (1)
{
int sw = windw / scale;
int sh = windh / scale;
if (sw <= imgw && sh <= imgh)
{
return scale;
}
scale++;
}
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭