何 杰,王大立
(1.北方民族大學(xué) 化學(xué)與化學(xué)工程學(xué)院,寧夏 銀川 750021;2.蘭州城市學(xué)院 體育學(xué)院,甘肅 蘭州 730070)
OpenCV(Open Source Computer Vision Library) 是 由Intel公司建立的一個開源跨平臺計算機視覺庫。OpenCV使用C/C++開發(fā),同時也提供了Python、Java、MATLAB等語言接口,可以運行在多種操作系統(tǒng)上。OpenCV應(yīng)用領(lǐng)域非常廣泛,包括圖像拼接、圖像降噪、產(chǎn)品質(zhì)檢、人機交互、人臉識別、動作識別、動作跟蹤、無人駕駛等;OpenCV還提供了機器學(xué)習(xí)模塊[1-3]。應(yīng)用其內(nèi)置函數(shù)可以高效地實現(xiàn)計算機視覺算法,利用該函數(shù)庫可以相當(dāng)便捷地實現(xiàn)各種圖像變換操作。
鄒宏偉[4]利用OpenCV加強數(shù)字圖像處理效果,進行了視頻圖像采集及其應(yīng)用研究。李紅巖等[5]設(shè)計并實現(xiàn)了一種基于OpenCV的乒乓球分類撿球機器人。乒乓球識別程序?qū)z像頭采集數(shù)據(jù)經(jīng)過濾波、灰度化(cv2.cvtColor())、圓形檢測(cv2.HoughCircles())、顏色識別(cv.inRange())等方式處理,精確識別乒乓球并將位置及顏色信息以串口通信方 式發(fā)送給控制器。林云[6]設(shè)計了基于OpenCV的道路車牌識別系統(tǒng);利用車牌特征圖像進行車牌定位,再做灰度化處理;然后基于Radon變換的傾斜校正、二值化、腐蝕、膨脹等數(shù)字圖像處理算法來處理車牌圖像,去除車牌圖像環(huán)境干擾;最后運用垂直投影法分割車牌字符,用模板匹配方法來識別車牌字符,并輸出所識別信息。尹俊超等[7]基于OpenCV設(shè)計了一種多運動目標(biāo)檢測和跟蹤的自動化方案;利用CAMShift跟蹤算法提取每個目標(biāo)特征信息,實現(xiàn)對多個運動目標(biāo)的跟蹤,最后將運動目標(biāo)輪廓和運動軌跡描述出來。張伯辰等[8]以O(shè)penCV為核心,基于樹莓派構(gòu)建了一種疲勞駕駛檢測系統(tǒng)。度國旭[9]面向機器人搬運過程中動態(tài)物料 識別需求,采用 OpenCV 中 blur()和 cvtColor()函數(shù)進行圖像預(yù)處理;用Canny()函數(shù)得到圖像邊緣信息,對其邊緣利 用FindContours()函數(shù)進行輪廓檢索得到單一連續(xù)輪廓,并對每一條連續(xù)輪廓利用FitEllipse()函數(shù)進行圓擬合,最終實現(xiàn)了對典型特征的高概率識別。利用OpenCV函數(shù)庫,可以較好地實現(xiàn)各種格式圖片空間幾何、色彩、明暗等變換操作。張瑞等[10]將OpenCV算法融入國畫創(chuàng)作,使國畫具有更高清晰度和更好藝術(shù)效果。在本研究中,面向紋理貼圖應(yīng)用,作者探討了圖像處理圖形學(xué)編程技術(shù)。在Microsoft Visual C++編譯環(huán)境下,采用OpenCV計算機視覺庫混合編程,高效、便捷地實現(xiàn)了圖像旋轉(zhuǎn)、斜切變換?;贠penCV函數(shù)庫大大簡化了其實現(xiàn)過程,易于快速編程實現(xiàn)且效果較好,為后續(xù)相關(guān)研究打下了良好基礎(chǔ)。
圖像幾何變換實質(zhì)是改變像素空間位置。坐標(biāo)變換矩陣是一個3×3的矩陣,用來對圖形進行坐標(biāo)變換,將原坐標(biāo)點轉(zhuǎn)移到新坐標(biāo)點。因為一幅圖片由點陣和每一點上顏色信息組成,所以對坐標(biāo)變換就是對每一點進行搬移而最終形成新圖片。具體來說,圖形放大、縮小、移動、旋轉(zhuǎn)、透視、扭曲等都可以用此矩陣來完成。矩陣形式為:
其中:A、E控制縮放;B、D控制斜切;C、F控制平移。
仿射變換(Affine Transformation)可以將矩形轉(zhuǎn)換成平行四邊形,將其壓扁、旋轉(zhuǎn)或者成比例縮放。透視變換提供了更大靈活性,如可以將矩形轉(zhuǎn)變成梯形。仿射變換是透視變換的子集。
如圖1所示,圖像旋轉(zhuǎn)后變大了。若要保持尺寸,就要對圖像進行裁切,有些內(nèi)容就會有損失。float angle值被傳遞給 imgRotate()。imgRotate()為圖像旋轉(zhuǎn)子程序。如圖2所示,將輸入圖像繞笛卡爾坐標(biāo)系原點逆時針旋轉(zhuǎn)θ角度,則變換后圖像坐標(biāo)為:
圖1 旋轉(zhuǎn)變換核心代碼及效果圖
圖2 旋轉(zhuǎn)變換算法及對應(yīng)程序代碼
在 imgRotate()源碼中,首先,對源圖 3 個端點 (0, y)、(x, y)、(x, 0)進 行 旋 轉(zhuǎn) 變 換(Rotation Transformation), 算法如圖2所示。用“float pt[3][2]{…};”定義了3個端點,用“float matRotate[3][3]{…};”定義了旋轉(zhuǎn)變換矩陣。通過一個for循環(huán)對3個端點實施了坐標(biāo)旋轉(zhuǎn)變換。依據(jù)旋轉(zhuǎn)后3個端點坐標(biāo),通過min()和max()函數(shù)界定輸出圖像范圍,如圖3中矩形虛線框所劃定范圍。該矩形對角線坐標(biāo)是(fMin_x, fMax_x)和 (fMin_y, fMax_y)。對比旋轉(zhuǎn)前源圖和旋轉(zhuǎn)后主體圖形發(fā)現(xiàn),旋轉(zhuǎn)后,圖像變大了,如圖3矩形灰色虛線框所示大小。對這些周邊多余區(qū)域,用深灰色填充。圖3所示代碼中for循環(huán)控制拷貝輸出圖像,其結(jié)果是程序計算出輸出圖像在源圖像中對應(yīng)點坐標(biāo),然后復(fù)制該坐標(biāo)灰度值。順時針旋轉(zhuǎn)矩陣剛好是逆時針旋轉(zhuǎn)矩陣的轉(zhuǎn)置?!癿atRet.at
圖3 圖像旋轉(zhuǎn)核心代碼和算法說明
圖像斜切實際效果是得到平面景物在投影平面上非垂直投影。斜切會使圖形產(chǎn)生扭變,其原理是保持圖像上各點某一坐標(biāo)不變,將另一坐標(biāo)進行線性變換。坐標(biāo)不變的軸被稱為依賴軸,另一個軸為方向軸。斜切變換源碼與效果如圖4所示。圖4還展示了一個斜切應(yīng)用實例,被用于修正傾斜車牌號,便于識別。主程序基本流程是:頭文件包含→變量定義→載入圖像→斜切→輸出→保存圖像?!癴loat a = pi / 3”定義了斜切角度。通過“IplImage* inputimage= cvLoadImage(filename, -1);” 導(dǎo) 入 圖 像, 其 函 數(shù) 原 型 為“IplImage* cvLoadImage(const char* filename, int flags=CV_LOAD_IMAGE_COLOR)”,flags指定讀入圖像顏色和深度?!癱vCreateImage(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”指定每個像素通道數(shù)。圖像斜切變換命令被包含在for循環(huán)內(nèi),其核心代碼、注解如圖4所示。圖4顯示了斜切前后兩個淺灰色矩形,二者高度不變;斜切后圖像在寬或高上比源圖大,多出來背景像素被填充黑色(見圖4“0”值區(qū)域)。程序會智能區(qū)別背景區(qū)和圖像區(qū),并逐列、逐行、逐像素正確讀寫像素數(shù)據(jù)。實現(xiàn)圖像斜切變換時,必須考慮目標(biāo)、源像素點坐標(biāo)映射時插值問題。
圖4 斜切變換核心源碼與效果圖
為了使化工仿真更真實,可以將實物圖用作紋理圖。紋理映射能夠極大地提高虛擬物體真實感。通過本研究得出:(1)在Microsoft Visual Studio Enterprise 2019編譯環(huán)境下,采用C++結(jié)合OpenCV計算機視覺庫混合編程,可以高效、便捷地實現(xiàn)圖像旋轉(zhuǎn)、斜切變換?;贠penCV函數(shù)庫能夠大大簡化其實現(xiàn)過程,易于快速編程實現(xiàn)且效果較好,為進一步相關(guān)研究打下了良好基礎(chǔ)。(2)紋理映射可以賦予化工設(shè)備、管道、框架、廠房、場景等真實感,運用圖形學(xué)編程對各種格式圖形文件進行靈活變換有利于更好地應(yīng)用紋理映射。為將計算機圖形學(xué)編程用于化工仿真、虛擬現(xiàn)實,作者依據(jù)圖像顏色點陣數(shù)據(jù),編寫計算機程序,實現(xiàn)了圖像像素級編輯。
物聯(lián)網(wǎng)技術(shù)2021年11期