关闭

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

411人阅读 评论(0) 收藏 举报

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++;
}
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:28666次
    • 积分:625
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:28篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论