化工仿真中图像翻转变换图形学编程研究

2021-09-10 20:38何杰王大立袁红姜国平
无线互联科技 2021年6期
关键词:镜像虚拟现实

何杰 王大立 袁红 姜国平

摘 要:OpenGL和OpenCV特有开源库函数被用于图像变换,显示了高效、便捷性。文章面向纹理贴图应用,对位图文件结构进行了详尽解析;依据图像颜色点阵数据,用C++结合OpenCV编写了位图镜像变换程序。通过调用OpenCV库函数,所编镜像变换程序代码更简单,功能更完备,不仅可被用于处理*.bmp格式图片,还能被用于处理*.jpg, *.png, *.webp, *.pbm, *.pgm, *.sr, *.ras, *.tiff, *.tif等格式图片。基于OpenCV函数库,易于快速编程实现各种图像变换且效果较好,为进一步应用研究打下了基础。

关键词:图形学编程;镜像;像素读写;位图;OpenCV;化工仿真;虚拟现实

0    引言

实际物体表面有丰富纹理,要绘制逼真的3D物体,除光照处理外,还要给其表面附上纹理特征,用到“纹理贴图”技术[1-2]。OpenGL(Open Graphics Library)是被用于渲染2D、3D矢量圖形、跨语言、跨平台的应用程序编程接口,常被用于CAD、虚拟现实、科学可视化程序和电游开发。其关联软件有很好的移植性。简单说,OpenGL与硬件无关,独立于操作系统,支持网络运行。OpenCV(Open Source Computer Vision Library)广受欢迎,源代码开放,可被用于开发实时图像处理、计算机视觉及模式识别程序,在工业界及科研领域被广泛采用。OpenGL提供了位图操作函数。利用其纹理映射功能可以十分逼真地表达物体表面细节[3-5]。利用OpenCV函数库,可以较好地实现各种格式图片空间几何、色彩、明暗等变换操作[6]。

尹航等[7]讨论了在VS2005环境下借助OpenGL和第三方库CxImage(图像操作类库),利用PNG图片进行纹理映射。袁亮等[1]为了实现二次曲面纹理映射,在分析OpenGL纹理映射技术的基础上,详细讨论了球形曲面纹理坐标生成和设置;然后,利用OpenGL函数库,在VC++环境下,实现了雷达天线罩迷彩纹理贴图。薛兆井   等[3]研究了基于OpenGL读取bmp图像实现纹理映射的一种新方法。韩姣[8]探讨了在VC++环境下bmp与gif图像文件格式转换,编程实现了bmp图像读取、显示和保存等相关操作。文章面向纹理贴图应用,探讨了图像镜像变换图形学编程技术。

1    Bitmap-file解析

用WinHex查看一24-bit Bitmap file(图1),知它每行   420 pixels(width)×3 Bytes/pixel=1 260 Bytes,能被4整除,不用进行补位。对此图变换无须考虑这些无效或冗余填充数据。本Bitmap file总大小为420 pixels(宽)*534 pixels(高)*3 Bytes/pixel+14 Bytes(size of bitmap-file header)+    40 Bytes(size of bitmap-information header)+2(Photoshop图像整体补位) =672 896 Bytes,或672 896 Bytes/1 024 Bytes/KB≈657 KB。图像大小为672 837/3+1 =224 280 pixels=        420 pixels(宽)*534 pixels(高)。

2    位图镜像变换机理与编程实现

如图2所示,其像素数据写入顺序统一为“左右下上”。区别是像素数据读取次序,对于原图输出,其顺序是“左右下上”,而对于镜像变换,为“右左下上”。或者说,其逐行像素信息被左右对换了。按一定次序,程序首先提取源图右下角单元格数据,写入镜像图左下角单元格内,以此类推。表达式“bmpImg->imageData[i * width * 3 + j * 3 + k] = pixVal;”引用了指针bmpImg指向的结构体IMAGE成员imageData。

3    OpenCV应用实例

应用C++结合OpenCV混合编程(Win7_64-bit System,VS2019+OpenCV4.3.0)可以更方便地对图片进行镜像变换。其变换机制与程序注解如下:

3.1  读取图像

Mat src = imread(“kneader.jpg”, CV_LOAD_IMAGE_UNCHANGED); Imread( )函数经常与imshow(“src”, src); 配合使用。可以理解Mat为一个数据存储容器,定义了一个src对象来存储图像数据。Mat类能够自动管理内存。

3.2  创建矩阵

inline void Mat::create(Size _sz, int _type)Mat类是一个矩阵图像类,由两部分组成:矩阵头,包含矩阵尺寸、存储方法、存储地址等信息,和一个指向存储图像中所有像素的矩阵体。例如,“cv::Mat dstImg;”仅创建了图像矩阵信息头部分,并未创建矩阵体。因此,cv::Mat::create( )函数作用就很清楚了,创建一个指定大小(Size),指定类型type(CV_8UC1, CV_16SC1, CV_32FC3)的图像矩阵体。

3.3  镜像生成

for ( init; condition; increment ) {  statement(s); }镜像生成主代码被包含在C++ for循环内,如图2所示。镜像变换基本机制是,保持两图像素横坐标值不变,纵坐标值次序发生顺逆转化。Mat类提供了一个at方法,SrcImage.at(i,j)访问图像第i行j列像素,SrcImage.at(i,j)[k]读取彩图第i行j列k通道颜色点数据。Vec3b是图像像素值类型。

3.4  像素重映射

remap(src, dst, map_x, map_y, CV_INTER_LINEAR); 图像坐标映射关联有两种,一种是计算源图任意像素在映射后图像坐标位置,另一种是计算变换后图像任意像素被反映射在源图坐标位置。重映射就是把一图中某位置像素“放置”到另一图指定位置的过程。为了完成重映射有必要获得一些插值作为非整数像素坐标,因为源图、目标图像素坐标非一一对应。通过重映射来表达每个像素新位置g(x,y),滿足g(x,y)=f(h(x,y))。h(x,y)是作用于(x,y)的映射方法函数。最后,用imshow( )显示图像;用waitkey(0)使图像显示保持,而非一闪而过。

4    结语

纹理映射能极大地提高虚拟物体真实感。为使化工仿真更真实,可以将实物图用作纹理图。在对bmp图及其他格式图像变换方面,本研究主要内容、结论有:

(1)用WinHex查阅了一例图Bitmap-file,解析了Bitmap-file数据、结构。明确了Bitmap像素点与Bitmap-file中像素点阵数据一一对应关系。基于图像颜色点阵数据,用Visual Studio 2013中Visual C++结合OpenGL编写了位图镜像生成程序;

(2)基于位图像素数据读写函数fread与fwrite,设计了特定像素数据读写顺序,实现了位图镜像变换;

(3)在Microsoft Visual C++编译环境下,采用OpenCV计算机视觉库混合编程,高效、便捷实现了图像镜像变换;

(4)纹理映射可以赋予化工设备、管道、框架、厂房、场景真实感,运用图形学编程对各种实物图片进行灵活变换有利于更好地应用纹理映射。

[参考文献]

[1]袁亮,张兵,李广强.OpenGL二次曲面纹理映射技术分析与应用[J].空军雷达学院学报,2009(5):376-378.

[2]唐聪.基于OpenGL的三维场景可视化仿真[D].西安:西安电子科技大学,2013.

[3]薛兆井,胡平平.基于OpenGL读取bmp实现纹理映射的方法[J].军民两用技术与产品,2009(9):40-41.

[4]赵方,张军和,彭亚雄.基于OpenGL纹理映射反走样技术的研究[J].电脑知识与技术,2011(17):4160-4161,4164.

[5]吴发辉,张玲,余文森.基于图形学算法的纹理映射技术的研究与实现[J].现代电子技术,2018(24):71-74.

[6]赵浩杰,金德智,李彦杰.基于OpenCV的彩色目标识别[J].中国科技信息,2016(2):36-37.

[7]尹航,李义杰,孙健超.基于OpenGL的PNG纹理映射的实现[J].计算机系统应用,2009(7):182-185.

[8]韩姣.基于VC++的BMP格式图像与GIF格式图像转换 [J].武汉理工大学学报(信息与管理工程版),2007(12):23-25,30.

(编辑 王雪芬)

猜你喜欢
镜像虚拟现实
镜像
REALITY BITES
虚拟现实技术向科幻小说借灵感
浅谈虚拟现实