何 杰,王大立
(1.北方民族大學 化學與化學工程學院,寧夏 銀川 750021;2.蘭州城市學院 體育學院,甘肅 蘭州 730070)
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函數庫大大簡化了其實現過程,易于快速編程實現且效果較好,為后續相關研究打下了良好基礎。
圖像幾何變換實質是改變像素空間位置。坐標變換矩陣是一個3×3的矩陣,用來對圖形進行坐標變換,將原坐標點轉移到新坐標點。因為一幅圖片由點陣和每一點上顏色信息組成,所以對坐標變換就是對每一點進行搬移而最終形成新圖片。具體來說,圖形放大、縮小、移動、旋轉、透視、扭曲等都可以用此矩陣來完成。矩陣形式為:

其中:A、E控制縮放;B、D控制斜切;C、F控制平移。
仿射變換(Affine Transformation)可以將矩形轉換成平行四邊形,將其壓扁、旋轉或者成比例縮放。透視變換提供了更大靈活性,如可以將矩形轉變成梯形。仿射變換是透視變換的子集。
如圖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

圖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 斜切變換核心源碼與效果圖
為了使化工仿真更真實,可以將實物圖用作紋理圖。紋理映射能夠極大地提高虛擬物體真實感。通過本研究得出:(1)在Microsoft Visual Studio Enterprise 2019編譯環境下,采用C++結合OpenCV計算機視覺庫混合編程,可以高效、便捷地實現圖像旋轉、斜切變換。基于OpenCV函數庫能夠大大簡化其實現過程,易于快速編程實現且效果較好,為進一步相關研究打下了良好基礎。(2)紋理映射可以賦予化工設備、管道、框架、廠房、場景等真實感,運用圖形學編程對各種格式圖形文件進行靈活變換有利于更好地應用紋理映射。為將計算機圖形學編程用于化工仿真、虛擬現實,作者依據圖像顏色點陣數據,編寫計算機程序,實現了圖像像素級編輯。