機器視覺 machine vision
機器視覺是人工智能正在快速發展的一個分支。機器視覺作為生產過程中關鍵技術之一,在機器或者生產線上,機器視覺可以檢測產品質量以便將不合格的產品剔除,或者指導機器人完成組裝工作,與整個生產密切相關。
什么是機器視覺?
簡單來說,機器視覺就是用機器代替人眼來做測量和判斷。機器視覺系統是通過機器視覺產品將被攝取目標轉換成圖像信號,傳送給專用的圖像處理系統,得到被攝目標的形態信息,根據像素分布和亮度、顏色等信息,轉變成數字化信號;圖像系統對這些信號進行各種運算來抽取目標的特征,進而根據判別的結果來控制現場的設備動作。機器視覺是一項綜合技術,包括圖像處理、機械工程技術、控制、電光源照明、光學成像、傳感器、模擬與數字視頻技術、計算機軟硬件技術(圖像增強和分析算法、圖像卡、 I/O卡等)。一個典型的機器視覺應用系統包括圖像捕捉、光源系統、圖像數字化模塊、數字圖像處理模塊、智能判斷決策模塊和機械控制執行模塊。
#MicroPython動手做(07)——零基礎學MaixPy之機器視覺
#實驗程序之一:affine 仿射變換(實時縮放)
#MicroPython動手做(07)——零基礎學MaixPy之機器視覺 #實驗程序之一:affine 仿射變換(實時縮放) import image import lcd, sensor import time lcd.init() # lcd.init(type=2, freq=20000000) sensor.reset(freq=24000000) sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)]) print("matrix:") print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2])) print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5])) print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8])) try: del img del img2 except Exception: pass img2 = image.Image(size=(320, 240)) img2.pix_to_ai() flag = False while 1: img = sensor.snapshot() image.warp_affine_ai(img, img2, matrix) img2.ai_to_pix() if flag: lcd.display(img2) else: lcd.display(img) flag = not flag time.sleep_ms(500)
串口輸出
>>> init i2c2
[MAIXPY]: find gc3028
True
matrix:
[1.34, -0.12, -62.37]
[0.12, 1.34, -56.84]
[0.00, 0.00, 1.00]
變換模型
是指根據待匹配圖像與背景圖像之間幾何畸變的情況,所選擇的能最佳擬合兩幅圖像之間變化的幾何變換模型。可采用的變換模型有如下幾種:剛性變換、仿射變換、透視變換和非線形變換等,其中第三個的仿射變換就是這里要探討的。
仿射變換
拉伸、收縮、扭曲、旋轉是圖像的幾何變換,在三維視覺技術中大量應用到這些變換,又分為仿射變換和透視變換。仿射變換可以將矩形轉換成平行四邊形,它可以將矩形的邊壓扁但必須保持邊是平行的,也可以將矩形旋轉或者按比例變化。透視變換提供了更大的靈活性,一個透視變換可以將矩陣轉變成梯形。當然,平行四邊形也是梯形,所以仿射變換是透視變換的子集。
image — 機器視覺
移植於 openmv, 與 openmv 功能相同
get_affine_transform()函數
計算3個二維點對之間的仿射變換矩陣H(2行x3列),自由度為6。仿射變換的原理就是根據源圖像中一個三角形的頂點坐標和應用仿射變換之后的目標圖像中一個三角形的頂點坐標計算出一個變換矩陣,然后將這個矩陣應用到整個源圖像。
matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])
前面三組為輸入源圖像中的三角形頂點坐標
后面三組為輸出目標圖像中的三角形頂點坐標
舉例說明
輸入源圖像中的三角形頂點坐標 ([[20, 20], [30, 20], [20, 0]])
輸出目標圖像中的三角形頂點坐標 ([[20, 20], [30, 20], [25, 0]])
紅色是原圖中的三角形,綠色是應用仿射變換之后的目標圖像的三角形,根據這個設置應用仿射變換之后圖像應該像左邊扭曲,有了這兩個三角形的頂點坐標,get_affine_transform()函數就能計算得到一個仿射變換矩陣,並在原圖應用仿射變換就得到了扭曲之后的圖像(綠色的)。
嘗試變動目標圖像的三個頂點,看看有什么變化
matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)]) matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)])
#MicroPython動手做(07)——零基礎學MaixPy之機器視覺 #實驗程序之一:affine 仿射變換(實時縮放)之二 import image import lcd, sensor import time lcd.init() # lcd.init(type=2, freq=20000000) sensor.reset(freq=24000000) sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)]) print("matrix:") print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2])) print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5])) print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8])) try: del img del img2 except Exception: pass img2 = image.Image(size=(320, 240)) img2.pix_to_ai() flag = False while 1: img = sensor.snapshot() image.warp_affine_ai(img, img2, matrix) img2.ai_to_pix() if flag: lcd.display(img2) else: lcd.display(img) flag = not flag time.sleep_ms(300)
點1, 2 和 3 (在圖一中形成一個三角形) 與圖二中三個點一一映射, 仍然形成三角形, 但形狀已經大大改變. 如果我們能通過這樣兩組三點求出仿射變換 (你能選擇自己喜歡的點), 接下來我們就能把仿射變換應用到圖像中所有的點。
#MicroPython動手做(07)——零基礎學MaixPy之機器視覺
#實驗程序之二:image deal 圖像處理(深色浮雕)
#MicroPython動手做(07)——零基礎學MaixPy之機器視覺 #實驗程序之二:image deal 圖像處理(深色浮雕) import sensor import image import lcd import time lcd.init(freq=15000000) sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.run(1) origin = (0,0,0, 0,1,0, 0,0,0) edge = (-1,-1,-1,-1,8,-1,-1,-1,-1) sharp = (-1,-1,-1,-1,9,-1,-1,-1,-1) relievo = (2,0,0,0,-1,0,0,0,-1) tim = time.time() while True: img=sensor.snapshot() img.conv3(edge) lcd.display(img) if time.time() -tim >10: break tim = time.time() while True: img=sensor.snapshot() img.conv3(sharp) lcd.display(img) if time.time() -tim >10: break tim = time.time() while True: img=sensor.snapshot() img.conv3(relievo) lcd.display(img) if time.time() -tim >10: break lcd.clear()
image deal 圖像處理
讀取圖片(或者實時動態攝像),對像素點任意操作並生成圖片,如對像素點進行ARGB的分解,或者將ARGB恢復成像素值,對每個像素點進行修改轉換等等。
(Read the image, any operation on the pixels to generate the picture. If the pixel of ARGB decomposition or ARGB back into pixel values, modify the conversion, and so each pixel.)