4_樹莓派機(jī)載計(jì)算機(jī)的機(jī)器視覺樣例教程——無名創(chuàng)新
樹莓派機(jī)載計(jì)算機(jī)的機(jī)器視覺樣例教程
執(zhí)行本樣例程序需要的硬件
樹莓派機(jī)載計(jì)算機(jī)

攝像頭
參照官方介紹:樹莓派文檔 - 相機(jī) (raspberrypi.com)
OV5647IMX219USB攝像頭



其中攝像頭本樣例選用性價(jià)比最高的官方V1.3版本攝像頭,該版本攝像頭焦距為3.6mm,廣角為66度,市面上也存在不同廣角、焦距的版本,可以根據(jù)實(shí)際使用需求來選型。
1、圖像的讀取、灰度化、顏色分割、圖像合成
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值imread(path, num)CV2從某一路徑下以某種編碼方式讀取圖片第一個(gè)參數(shù)path為圖片路徑,第二個(gè)參數(shù)num是以什么方式讀入圖片,1為彩色,0位黑白,默認(rèn)為彩色圖像數(shù)組cvtColor(p1,p2)CV2顏色空間轉(zhuǎn)換第一個(gè)參數(shù)p1待轉(zhuǎn)換的圖片,第二個(gè)參p2是轉(zhuǎn)化的圖片格式,例如CV2.COLOR_BGR2RGB 將BGR格式轉(zhuǎn)換成RGB格式、CV2.COLOR_BGR2GRAY將BGR格式轉(zhuǎn)換成GRAY格式圖像數(shù)組imshow(name,pic)CV2圖像窗口顯示第一個(gè)參數(shù)name是一個(gè)窗口名稱,數(shù)據(jù)類型為字符串。第二個(gè)參數(shù)pic是需要顯示的圖像無split(pic)CV2拆分圖像成單個(gè)顏色通道數(shù)據(jù)獲取參數(shù)pic為BGR類型的圖像數(shù)組(B,G,R)三個(gè)通道顏色數(shù)據(jù)merge([b,g,r])CV2將單通道圖像的合并成多通道b,g,r為三個(gè)通道圖像數(shù)組合成的多通道圖像數(shù)組sleep(n)time延時(shí)函數(shù)參數(shù)n為延時(shí)時(shí)間,單位為秒無shape[a]numpy查看矩陣或者獲取形狀對(duì)象為矩陣時(shí):
二維數(shù)組時(shí)參數(shù)a=0表示查看行數(shù)、1表示列數(shù);三維時(shí)a=0表示二維數(shù)組的個(gè)數(shù),1表示二維數(shù)組的行數(shù)、2表示二維數(shù)組的列數(shù);
#對(duì)象為圖像時(shí):
img.shape[:2]取彩色圖片的長、寬
img.shape[:3]取彩色圖片的長、寬、通道
img.shape[0]圖像的垂直尺寸(高度)
img.shape[1]圖像的水平尺寸(寬度)
img.shape[2]圖像的通道數(shù)返回維度zeros((a,b),dtype)numpy定義零矩陣(a,b)待生成矩陣的行、列,dtype數(shù)據(jù)類型零矩陣
執(zhí)行本demo終端輸入
python3 1_image_file_read_write_split_merge.py
結(jié)果如下圖所示:

2、圖像的抓取與邊緣檢測(cè)
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值VideoCapture(path)CV2從目標(biāo)相機(jī)或者視頻中抓取視頻參數(shù)path為攝像頭名稱,類型為字符串視頻抓取對(duì)象set(propId,value)CV2對(duì)抓取對(duì)象的參數(shù)進(jìn)行設(shè)置參數(shù)propId過多,不便列舉,具體參照《OpenCV-Python中文教程》page 7無read()CV2獲取一幀圖像無返回參數(shù)ret,img分別為抓取狀態(tài)和圖像flip(filename, flipcode)CV2對(duì)圖像進(jìn)行翻轉(zhuǎn)參數(shù)filename需要操作的圖像
參數(shù)flipcode表示翻轉(zhuǎn)方式,1:hor 0:vert -1:hor+vert翻轉(zhuǎn)后的圖像Canny( img, threshold1, threshold2,apertureSize)CV2邊緣檢測(cè)參數(shù)img為灰度圖像
參數(shù)threshold1、threshold1為上下閾值
參數(shù)apertureSize為Sobel 算子大小
計(jì)算得到的邊緣圖像
執(zhí)行本demo終端輸入
python3 2_image_capture_canny_show.py
結(jié)果如下圖所示:

3、圖像的二值化
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值threshold(src, thresh, maxval, type):CV2將灰度圖像二值化src: 原圖像
thresh: 閾值
type: 指定閾值類型;
maxval: 當(dāng)type指定為THRESH_BINARY或THRESH_BINARY_INV時(shí),需要設(shè)置此值
type具體參照《OpenCV-Python中文教程》page 36返回二值化后的圖像subplot(a,b,i)
imshow(img)
title(str)matplotlib.pyplot調(diào)用參數(shù)有多種方式具體參照連接
matplotlib.pyplot.subplot — Matplotlib 3.5.1 文檔
matplotlib.pyplot.title — Matplotlib 3.5.1 文檔
matplotlib.pyplot.imshow — Matplotlib 3.5.1 文檔無adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)CV2自適應(yīng)閾值src:灰度圖像
maxValue:最大灰度值
adaptiveMethod:自適應(yīng)閾值算法。ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType:opencv提供的二值化方法,只能THRESH_BINARY或THRESH_BINARY_INV
blockSize:拆分的區(qū)域大小
返回二值化后的圖像
執(zhí)行本demo終端輸入
python3 3_image_binary.py
結(jié)果如下圖所示:

4、輪廓檢測(cè)與繪制
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值findContours(img, mode, method)CV2輪廓檢測(cè)img為輸入待檢測(cè)輪廓的圖像
mode為輪廓檢索的方式
CV2.RETR_EXTERNAL 只檢測(cè)外輪廓
CV2.RETR_LIST 檢測(cè)的輪廓不建立等級(jí)關(guān)系
CV2.RETR_CCOMP 建立兩個(gè)等級(jí)的輪廓
CV2.RETR_TREE 建立一個(gè)等級(jí)樹結(jié)構(gòu)的輪廓。
method為輪廓近視方法,常用的有:
CV2.CHAIN_APPROX_NONE CV2.CHAIN_APPROX_SIMPLE
具體參照《OpenCV-Python中文教程》page 36返回輪廓、輪廓的屬性drawContours(img, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)CV2輪廓繪制img為輪廓繪制的圖像
contours為輪廓數(shù)據(jù),數(shù)據(jù)類型為list
contourIdx指定繪制輪廓list中的哪條輪廓,-1表示繪制所有輪廓
color繪制的顏色
thickness表明輪廓線的寬度無
執(zhí)行本demo終端輸入
python3 4_otsu_binary_find_contours.py
結(jié)果如下圖所示:

5、hsv顏色分離二值化(紅色)
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值inRange(src, lower, upper)CV2顏色分離第一個(gè)參數(shù)hsv指的是原圖
第二個(gè)參數(shù)lower指的是圖像中低于這個(gè)lower的值,圖像值變?yōu)?
第三個(gè)參數(shù):upper指的是圖像中高于這個(gè)upper的值,圖像值變?yōu)?返回二值化后的圖像erode(src, kernel, iteration)CV2腐蝕操作第一個(gè)參數(shù)src表示的是輸入圖片
第二個(gè)參數(shù)kernel表示的是方框的大小
第三個(gè)參數(shù)iteration表示迭代的次數(shù)腐蝕操作后的圖像dilate(src, kernel, iteration)CV2膨脹操作第一個(gè)參數(shù)src表示的是輸入圖片
第二個(gè)參數(shù)kernel表示的是方框的大小
第三個(gè)參數(shù)iteration表示迭代的次數(shù)膨脹操作后的圖像
執(zhí)行本demo終端輸入
python3 5_hsv_binary_find_contours.py
結(jié)果如下圖所示:

6、blob特征點(diǎn)檢測(cè)與繪制
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值SimpleBlobDetector_Params()CV2創(chuàng)建一個(gè)檢測(cè)器默認(rèn)參數(shù)組無參數(shù)組默認(rèn)值paramsSimpleBlobDetector_create(params)CV2創(chuàng)建一個(gè)檢測(cè)器,采用修改后的參數(shù)params檢測(cè)器參數(shù)檢測(cè)器delect(gray)CV2特征點(diǎn)檢測(cè)gray灰度圖像提取到的關(guān)鍵點(diǎn)drawKeypoints(img,keypoints,outputimage,color)CV2關(guān)鍵點(diǎn)繪制img也就是原始圖片
keypoints從原圖中獲得的關(guān)鍵點(diǎn)
outputimage輸出
color顏色設(shè)置
flags繪圖功能的標(biāo)識(shí)設(shè)置繪制后的圖像
執(zhí)行本demo終端輸入
python3 6_simple_blob_detect.py
結(jié)果如下圖所示:

7、霍夫圓檢測(cè)
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值HoughCircles(img, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)CV2霍夫圓檢測(cè)gray灰度圖像
method檢測(cè)方法,常用參數(shù)CV_HOUGH_GRADIENT
dp為內(nèi)測(cè)圓心累加器圖像的分辨率和輸入圖像之比的倒數(shù)
minDist檢測(cè)兩個(gè)圓心之間的最小半徑
circles為檢測(cè)圓返回值
param1表示canny邊緣檢測(cè)算子的高閾值
param2為檢測(cè)的圓心的累加器閾值
minRadius、maxRadius分別表示圓的最小和最大半徑檢測(cè)到的圓數(shù)據(jù)
執(zhí)行本demo終端輸入
python3 7_hough_circles_detect.py
結(jié)果如下圖所示:

8、霍夫線檢測(cè)
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值HoughLinesP(img,rho,theta, threshold,lines, minLineLength,maxLineGap)CV2霍夫線檢測(cè)第一個(gè)參數(shù)image為二值圖像,一般使用canny邊緣檢測(cè)的結(jié)果圖像;
第二個(gè)參數(shù)rho表示線段以像素為單位的距離精度
第三個(gè)參數(shù)theta, 線段以弧度為單位的角度精度
threshod: 累加平面的閾值參數(shù)
lines:返回檢測(cè)線數(shù)據(jù)
minLineLength:線段以像素為單位的最小長度
maxLineGap:同一方向上兩條線段判定為一條線段的最大允許間隔檢測(cè)到的線數(shù)據(jù)
執(zhí)行本demo終端輸入
python3 8_find_hough_lines.py
結(jié)果如下圖所示:

9、形狀輪廓匹配
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值matchShapes(contour1, contour2, method, parameter)CV2匹配輪廓形狀第一個(gè)參數(shù)contour1是模板輪廓
第二個(gè)參數(shù)contour2是用于匹配的輪廓模板
第三個(gè)參數(shù)method比較方式
第四個(gè)參數(shù)暫時(shí)沒用到,一般直接給0匹配到的輪廓
執(zhí)行本demo終端輸入
python3 1_template_match.py
結(jié)果如下圖所示:

10、手勢(shì)識(shí)別與人臉識(shí)別
本例程涉及的函數(shù)功能與參數(shù)介紹參照官方資料:
cvzone: 人臉檢測(cè),手勢(shì)檢測(cè)等 (gitee.com)
執(zhí)行本demo終端輸入
python3 2_hand_detector.py
python3 3_face_detector.py
結(jié)果如下圖所示:


11、級(jí)聯(lián)分類器與人臉識(shí)別
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值CascadeClassifier(path)CV2初始化分類器參數(shù)path為分類器訓(xùn)練好的標(biāo)準(zhǔn)數(shù)據(jù)路徑創(chuàng)建好的分類器detectMultiScale(gray,scaleFactor,minNeighbors)CV2分類器檢測(cè)第一個(gè)參數(shù)gray輸入檢測(cè)圖像
第二個(gè)參數(shù)scaleFactor前后兩次相繼的掃描中搜索窗口的比例系數(shù)
第三個(gè)參數(shù)minNeighbors表示構(gòu)成檢測(cè)目標(biāo)的相鄰矩形的最小個(gè)數(shù)檢測(cè)出的對(duì)象坐標(biāo)信息
執(zhí)行本demo終端輸入
python3 4_classifier_detector.py
結(jié)果如下圖所示:

12、二維碼與條形碼的檢測(cè)
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值QRCodeDetector()CV2初始化二維碼檢測(cè)器無二維碼檢測(cè)器detectAndDecode(gray)CV2識(shí)別二維碼gray為灰度圖像codeinfo二維碼表征的信息
points表示二維碼的角點(diǎn)
qrcode表示二維碼的原始排列
執(zhí)行本demo終端輸入
python3 5_qrcode_detector.py
python3 6_pyzbar_detector.py
結(jié)果如下圖所示:


13、AprilTag標(biāo)簽識(shí)別
本例程涉及的函數(shù)功能與參數(shù)介紹如下:
函數(shù)名稱功能包名功能參數(shù)返回值apriltag.Detector(apriltag.DetectorOptions(families=‘tag36h11’))apriltag初始化AprilTag檢測(cè)器AprilTag標(biāo)簽組AprilTag檢測(cè)器detect(gray,return_image=True)apriltag識(shí)別AprilTaggray為灰度圖像
return_image表示使能圖像返回tags識(shí)別到的AprilTag信息,img_返回的二維碼圖像
執(zhí)行本demo終端輸入
python3 7_apriltag_detector.py
結(jié)果如下圖所示:
