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

去除图像旋转黑边现象

人脸图像预处理——眼睛坐标对齐,去除黑边的干扰信息。 图像旋转的时候,图像的尺寸会变大,旋转以后增加的区域不做特殊处理的话,会被0填充,即会出现黑边现象。 去除黑边现象的办法: 1)在做图像...
  • anan1205
  • anan1205
  • 2016年05月10日 11:49
  • 3366

MATLAB怎么去掉旋转后的黑边方法

最近需要对文字进行倾斜校正,所以先旋转了一个图像,结果在旋转回去四周有黑边,怎么去掉黑边?在网上找了好多资料没有解决,偶然想起了OCR识别一句代码,发现很简单,现在教大家去掉。 旋转回来图像 ...
  • FL1623863129
  • FL1623863129
  • 2017年06月13日 20:15
  • 655

ARCGIS中遥感影像去除黑边方法

(1)在ArcMap中显示的时候,我不希望看到黑边。 (2)我需要将黑边的数据设置为NoData。借助于强大的ArcGIS栅格运算功能,这两点都不成问题。分别介绍如下:...
  • zglybl
  • zglybl
  • 2017年07月17日 09:00
  • 1719

OpenCv黑边

最近在开发一款人脸识别的项目,遇到一个问题,在横屏显示时,有黑边问题,可以通过以下的方法来是屏幕全屏: 1.找到这个类CameraBridgeViewBase.java    然后找到这个方法:de...
  • tangweiguo0305
  • tangweiguo0305
  • 2017年08月08日 18:19
  • 428

基于Qt,OpenCV去图像背景,去图像黑边软件

开发环境:Qt5.5.1  msvc2012  opencv2.4.9 开发此软件目的:从导师那淘汰一台旧的相机式扫描仪,相机照出来的图片效果不佳,有暗黄色背景,有黑边,软件作用就是除去这些噪声。 软...
  • qq_35759050
  • qq_35759050
  • 2017年01月08日 22:31
  • 1268

[python + opencv] 视频帧图像去黑边

图像去黑边算法 def rmBlackBorder(src, thres, diff, shrink): # # remove the black border on both ...
  • Foolishwolf_x
  • Foolishwolf_x
  • 2014年09月29日 18:01
  • 2815

【OpenCV】图像旋转详解,边缘用黑色填充

项目要用到图像旋转,OpenCV里面居然没有专门封装好的函数,只好自己写了。根据《learnning OpenCV》发现效果不是很理想,旋转后图像大小不变,可是图像却被裁减了。 例子如下: int m...
  • u010418035
  • u010418035
  • 2015年04月17日 20:55
  • 3360

使用opencv去掉二值化图像中黑色面积较小的连通域

  • 2011年05月23日 19:56
  • 1KB
  • 下载

最近邻方法进行图像旋转 c++代码 旋转后图像内容无损失

该文章介绍了 采用最近邻方法实现函数旋转的原理以及代码实现,旋转后保留图片内容,图片变大了一丢丢~...
  • Chunfengyanyulove
  • Chunfengyanyulove
  • 2015年12月06日 13:10
  • 1698

OpenCV2 图像旋转偏移问题

  • luoshi006
  • luoshi006
  • 2016年07月08日 17:56
  • 615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv图片旋转后图片无法填满窗口有黑边解决方法
举报原因:
原因补充:

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