图像旋转、斜切变换图形学编程研究

2021-11-22 08:14王大立
物联网技术 2021年11期
关键词:函数库图形学车牌

何 杰,王大立

(1.北方民族大学 化学与化学工程学院,宁夏 银川 750021;2.兰州城市学院 体育学院,甘肃 兰州 730070)

0 引 言

OpenCV(Open Source Computer Vision Library) 是 由Intel公司建立的一个开源跨平台计算机视觉库。OpenCV使用C/C++开发,同时也提供了Python、Java、MATLAB等语言接口,可以运行在多种操作系统上。OpenCV应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等;OpenCV还提供了机器学习模块[1-3]。应用其内置函数可以高效地实现计算机视觉算法,利用该函数库可以相当便捷地实现各种图像变换操作。

邹宏伟[4]利用OpenCV加强数字图像处理效果,进行了视频图像采集及其应用研究。李红岩等[5]设计并实现了一种基于OpenCV的乒乓球分类捡球机器人。乒乓球识别程序将摄像头采集数据经过滤波、灰度化(cv2.cvtColor())、圆形检测(cv2.HoughCircles())、颜色识别(cv.inRange())等方式处理,精确识别乒乓球并将位置及颜色信息以串口通信方 式发送给控制器。林云[6]设计了基于OpenCV的道路车牌识别系统;利用车牌特征图像进行车牌定位,再做灰度化处理;然后基于Radon变换的倾斜校正、二值化、腐蚀、膨胀等数字图像处理算法来处理车牌图像,去除车牌图像环境干扰;最后运用垂直投影法分割车牌字符,用模板匹配方法来识别车牌字符,并输出所识别信息。尹俊超等[7]基于OpenCV设计了一种多运动目标检测和跟踪的自动化方案;利用CAMShift跟踪算法提取每个目标特征信息,实现对多个运动目标的跟踪,最后将运动目标轮廓和运动轨迹描述出来。张伯辰等[8]以OpenCV为核心,基于树莓派构建了一种疲劳驾驶检测系统。度国旭[9]面向机器人搬运过程中动态物料 识别需求,采用 OpenCV 中 blur()和 cvtColor()函数进行图像预处理;用Canny()函数得到图像边缘信息,对其边缘利 用FindContours()函数进行轮廓检索得到单一连续轮廓,并对每一条连续轮廓利用FitEllipse()函数进行圆拟合,最终实现了对典型特征的高概率识别。利用OpenCV函数库,可以较好地实现各种格式图片空间几何、色彩、明暗等变换操作。张瑞等[10]将OpenCV算法融入国画创作,使国画具有更高清晰度和更好艺术效果。在本研究中,面向纹理贴图应用,作者探讨了图像处理图形学编程技术。在Microsoft Visual C++编译环境下,采用OpenCV计算机视觉库混合编程,高效、便捷地实现了图像旋转、斜切变换。基于OpenCV函数库大大简化了其实现过程,易于快速编程实现且效果较好,为后续相关研究打下了良好基础。

1 几何变换

图像几何变换实质是改变像素空间位置。坐标变换矩阵是一个3×3的矩阵,用来对图形进行坐标变换,将原坐标点转移到新坐标点。因为一幅图片由点阵和每一点上颜色信息组成,所以对坐标变换就是对每一点进行搬移而最终形成新图片。具体来说,图形放大、缩小、移动、旋转、透视、扭曲等都可以用此矩阵来完成。矩阵形式为:

其中:A、E控制缩放;B、D控制斜切;C、F控制平移。

仿射变换(Affine Transformation)可以将矩形转换成平行四边形,将其压扁、旋转或者成比例缩放。透视变换提供了更大灵活性,如可以将矩形转变成梯形。仿射变换是透视变换的子集。

2 旋转变换

如图1所示,图像旋转后变大了。若要保持尺寸,就要对图像进行裁切,有些内容就会有损失。float angle值被传递给 imgRotate()。imgRotate()为图像旋转子程序。如图2所示,将输入图像绕笛卡尔坐标系原点逆时针旋转θ角度,则变换后图像坐标为:

图1 旋转变换核心代码及效果图

图2 旋转变换算法及对应程序代码

在 imgRotate()源码中,首先,对源图 3 个端点 (0, y)、(x, y)、(x, 0)进 行 旋 转 变 换(Rotation Transformation), 算法如图2所示。用“float pt[3][2]{…};”定义了3个端点,用“float matRotate[3][3]{…};”定义了旋转变换矩阵。通过一个for循环对3个端点实施了坐标旋转变换。依据旋转后3个端点坐标,通过min()和max()函数界定输出图像范围,如图3中矩形虚线框所划定范围。该矩形对角线坐标是(fMin_x, fMax_x)和 (fMin_y, fMax_y)。对比旋转前源图和旋转后主体图形发现,旋转后,图像变大了,如图3矩形灰色虚线框所示大小。对这些周边多余区域,用深灰色填充。图3所示代码中for循环控制拷贝输出图像,其结果是程序计算出输出图像在源图像中对应点坐标,然后复制该坐标灰度值。顺时针旋转矩阵刚好是逆时针旋转矩阵的转置。“matRet.at(j, i)= matSrc.at(y, x);”主要功能是将源图(x, y)与目标图坐标(x′, y′)一一对应,控制程序由坐标原点开始,逐个拷贝、写入像素或灰度值。

图3 图像旋转核心代码和算法说明

3 斜切变换

图像斜切实际效果是得到平面景物在投影平面上非垂直投影。斜切会使图形产生扭变,其原理是保持图像上各点某一坐标不变,将另一坐标进行线性变换。坐标不变的轴被称为依赖轴,另一个轴为方向轴。斜切变换源码与效果如图4所示。图4还展示了一个斜切应用实例,被用于修正倾斜车牌号,便于识别。主程序基本流程是:头文件包含→变量定义→载入图像→斜切→输出→保存图像。“float a = pi / 3”定义了斜切角度。通过“IplImage* inputimage= cvLoadImage(filename, -1);” 导 入 图 像, 其 函 数 原 型 为“IplImage* cvLoadImage(const char* filename, int flags=CV_LOAD_IMAGE_COLOR)”,flags指定读入图像颜色和深度。“cvCreateImage(cvSize((inputimage → width+inputima ge → height/tan(a)), inputimage → height), IPL_DEPTH_8U,inputimage→nChannels)”指定了图像宽为“inputimage→wid th+inputimage → height/tan(a)”,高为“inputimage → height”;“IPL_DEPTH_8U”表示图像元素位深度为无符号8位整型;“inputimage→nChannels”指定每个像素通道数。图像斜切变换命令被包含在for循环内,其核心代码、注解如图4所示。图4显示了斜切前后两个浅灰色矩形,二者高度不变;斜切后图像在宽或高上比源图大,多出来背景像素被填充黑色(见图4“0”值区域)。程序会智能区别背景区和图像区,并逐列、逐行、逐像素正确读写像素数据。实现图像斜切变换时,必须考虑目标、源像素点坐标映射时插值问题。

图4 斜切变换核心源码与效果图

4 结 语

为了使化工仿真更真实,可以将实物图用作纹理图。纹理映射能够极大地提高虚拟物体真实感。通过本研究得出:(1)在Microsoft Visual Studio Enterprise 2019编译环境下,采用C++结合OpenCV计算机视觉库混合编程,可以高效、便捷地实现图像旋转、斜切变换。基于OpenCV函数库能够大大简化其实现过程,易于快速编程实现且效果较好,为进一步相关研究打下了良好基础。(2)纹理映射可以赋予化工设备、管道、框架、厂房、场景等真实感,运用图形学编程对各种格式图形文件进行灵活变换有利于更好地应用纹理映射。为将计算机图形学编程用于化工仿真、虚拟现实,作者依据图像颜色点阵数据,编写计算机程序,实现了图像像素级编辑。

猜你喜欢
函数库图形学车牌
用于优化雷达信号处理的VSIPL函数库
Scratch求最值和平均值
数字图像处理技术在车牌识别系统中的应用
基于BB60C的IQ数据采集与存储系统设计
基于MATLAB 的车牌识别系统研究
突出实践需求的GIS专业《计算机图形学》课程优化改革
第7届国际图象图形学学术会议
非计算机专业计算机图形学教学改革初探
“他的车牌是……”
《计算机图形学基础教程》(第2版)