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

原创 2017年07月11日 11:57:34

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

PS 图像调整算法——亮度调整

亮度调整 非线性亮度调整: 对于R,G,B三个通道,每个通道增加相同的增量。 线性亮度调整: 利用HSL颜色空间,通过只对其L(亮度)部分调整,可达到图像亮度的线性调整。但是,RGB和HSL颜...

图像基本变换---图像亮度对比度调增算法

本文详细 介绍图像亮度对比度调增算法算法及实现,并给出了一份完整程序DEMO下载链接,跟大家分享一下,希望大家喜欢!...

android 图片旋转 叠加 去黑边

  • 2015年01月13日 15:09
  • 875KB
  • 下载

七牛用户使用imageView2接口发生图片旋转解决方法

七牛用户使用imageView2接口发生图片旋转解决方法案例介绍hello 能帮忙看一下什么情况否,缩略图发生旋转 旋转图:http://hhimg.wecuz.cn/E11ED7A6506FD4C...

android调用系统相机的方法,并且解决三星手机遇到的问题,图片旋转、压缩

在项目中遇到需要调用系统相机的功能点,整理方法如下 1.拍照完成之后直接存图片 [java] view plaincopy    Intent...

opencv实现图片旋转

  • 2016年04月11日 20:53
  • 38KB
  • 下载

python+opencv图片旋转矩形分割

有时候需要对有角度的矩形框内图像从原图片中分割出来。这里的程序思想是,先将图片进行矩形角度的旋转,使有角度的矩形处于水平状态后,根据原来坐标分割图片。 参考:http://blog.csdn.net...

OpenCV下的图片旋转

最近经常需要将图像进行旋转操作,然而opencv中似乎并没有现成的函数可以调用。(matlab中可以用imrotate函数进行旋转) 这里转载个网上牛人共享的版本:   #include "cv...
  • sromg
  • sromg
  • 2013年01月18日 20:50
  • 264

Qt creator5.7 OpenCV249之图片旋转(含源码下载)

Qt creator5.7 OpenCV249之图片旋转(含源码下载)

js实现图片旋转的三种方法

js实现图片旋转的三种方法 这篇文章主要介绍了js实现图片旋转的三种方法,需要的朋友可以参考下 1 使用jQueryRotate.js实现 示例代码: 复制代码 代码如下: ...
  • YaoXTao
  • YaoXTao
  • 2014年12月09日 15:11
  • 1352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv图片旋转后图片无法填满窗口有黑边解决方法
举报原因:
原因补充:

(最多只允许输入30个字)