在前幾周的文章中已經(jīng)介紹過如何在核桃派上用OpenCV讀取圖像并顯示到pyqt5的窗口上,這里在上一篇文章的基礎(chǔ)上,給開發(fā)板加入顏色檢測功能,嘗試將圖像中所有藍色的東西都用一個框標記出來。
顏色檢測核心api
按照慣例,先要介紹一下opencv中常用的hsv像素格式。顏色還是那個顏色,只是描述顏色用的參數(shù)變了。h代表色調(diào),s代表飽和度,v代表明度,比使用rgb格式更方便計算與思考。
opencv中也提供了將rgb bgr等轉(zhuǎn)為hsv圖片的api:
hsvImage = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.inRange,給定一個要檢測的hsv顏色范圍,返回一張黑白圖。將hsv值在該范圍內(nèi)的像素點全部變?yōu)榘咨辉诘膭t為黑色。
import numpy as np hsv_upper=np.array([125, 250, 250]) hsv_lower=np.array([95, 40, 40]) grayImage = cv2.inRange(hsvImage, hsv_lower, hsv_upper) # 顏色二值化
findContours,傳入黑白圖像,尋找所有輪廓。返回兩個列表,contours里是找到的所有輪廓,hierarchy是那些輪廓之間的相對位置關(guān)系
contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
minAreaRect,傳入一個輪廓,計算最小外接矩形
# 畫最小外接矩形 for cts in contours : rect = cv2.minAreaRect(cts)
drawContours, 繪制輪廓
box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(rgbImage, [box], 0, (255, 0, 0), 2)
基本測試代碼
import cv2 from ui_main import Ui_MainWindow import numpy as np import PyQt5 from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * # 修正qt的plugin路徑,因為某些程序(cv2)會將其改到其他路徑 import os os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.dirname(PyQt5.__file__) #【可選代碼】允許Thonny遠程運行 import os os.environ["DISPLAY"] = ":0.0" #【建議代碼】允許終端通過ctrl+c中斷窗口,方便調(diào)試 import signal signal.signal(signal.SIGINT, signal.SIG_DFL) timer = QTimer() timer.start(100) # You may change this if you wish. timer.timeout.connect(lambda: None) # Let the interpreter run each 100 ms # 線程類 class Work(QThread): signal_update_label = pyqtSignal(QPixmap) label:QLabel def sloat_update_label( self, pixmap self.label.setPixmap(pixmap) def run(self): print("label.width()=", self.label.width()) print("label.height()=", self.label.height()) self.signal_update_label.connect(self.sloat_update_label) cap = cv2.VideoCapture(1) while True: ret, frame = cap.read() if ret: # 顏色轉(zhuǎn)換 rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) hsvImage = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 二值化 hsv_upper=np.array([125, 250, 250]) hsv_lower=np.array([95, 40, 40]) grayImage = cv2.inRange(hsvImage, hsv_lower, hsv_upper) # 顏色二值化 # 查找并繪制最小外接矩形 contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) for cts in contours : rect = cv2.minAreaRect(cts) box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(rgbImage, [box], 0, (255, 0, 0), 2)
由于攝像頭拍出來的噪點很多,而物體由于本身材質(zhì)反光導致拍出來也有一些部分的顏色變了。所以實際應(yīng)用時需要對圖像進行一些濾波模糊化處理。或是直接對生成后的黑白圖像進行一定膨脹與收縮。
再把各個參數(shù)做成pyqt窗口的選項,查看各項搭配后的效果,快速找到合適的參數(shù)選擇。
# 圖像縮小并轉(zhuǎn)換顏色格式 frame = cv2.resize(frame, (320, 240)) rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgbImage.shape # 圖像模糊 if self.blur.flag : rgbImage = cv2.blur(rgbImage,(self.blur.num, self.blur.num)) if self.median.flag : rgbImage = cv2.medianBlur(rgbImage,self.median.num) if self.gaussian.flag : rgbImage = cv2.GaussianBlur(rgbImage, (self.gaussian.num, self.gaussian.num), 0) # 二值化 hsvImage = cv2.cvtColor(rgbImage, cv2.COLOR_RGB2HSV) grayImage = cv2.inRange(hsvImage, np.array([self.hl.num, self.sl.num, self.vl.num]), np.array([self.hu.num, self.su.num, self.vu.num])) # 顏色二值化 # 圖像操作 if self.dilate.flag : grayImage = cv2.dilate(grayImage, np.ones((self.dilate.num, self.dilate.num), dtype=np.uint8), 1) # 膨脹 if self.erode.flag : grayImage = cv2.erode(grayImage, np.ones((self.erode.num, self.erode.num), dtype=np.uint8), 1) # 腐蝕 # 獲取中心點的顏色,畫上十字光標 height, width = rgbImage.shape[:2] center_y, center_x = height // 2, width // 2 color = tuple(map(int, rgbImage[center_y, center_x, :])) cv2.line(rgbImage, (center_x, 0), (center_x, height-1), color, 3) cv2.line(rgbImage, (0, center_y), (width-1, center_y), color, 3) contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
-
usb
+關(guān)注
關(guān)注
60文章
7980瀏覽量
266085 -
攝像頭
+關(guān)注
關(guān)注
60文章
4862瀏覽量
96305 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41556
原文標題:在核桃派上實現(xiàn)USB攝像頭的OpenCV顏色檢測
文章出處:【微信號:gh_79acfa3aa3e3,微信公眾號:全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測
在全志H616核桃派上實現(xiàn)USB攝像頭的OpenCV顏色檢測
使用esp-iot-solution master分支的usb_stream攝像頭顏色不對是怎么回事?
OpenWRT + OpenCV 無線攝像頭監(jiān)控和圖像處理
【OK210試用體驗】之(五)——在Ubuntu12.04安裝OpenCV2.4.9并實現(xiàn)USB攝像頭C270圖像采集
NanoPi 2接USB攝像頭使用OpenCV
Nanopi M3 u***攝像頭使用opencv
【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組試用體驗】開箱報告
【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組試用體驗】使用opencv打開攝像頭
【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組測試三】--寵物機器人攝像頭人臉采集和識別
STM32單片機如何實現(xiàn)連接USB攝像頭
如何去實現(xiàn)一種基于opencv與flask的攝像頭圖像傳輸呢
STM32單片機實現(xiàn)連接USB攝像頭
![STM32單片機<b class='flag-5'>實現(xiàn)</b>連接<b class='flag-5'>USB</b><b class='flag-5'>攝像頭</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux下QT+OpenCV實現(xiàn)人臉實時檢測(攝像頭)
![Linux下QT+<b class='flag-5'>OpenCV</b><b class='flag-5'>實現(xiàn)</b>人臉實時<b class='flag-5'>檢測</b>(<b class='flag-5'>攝像頭</b>)](https://file.elecfans.com//web2/M00/60/04/pYYBAGL3RIGAYFo6AAQiLS3CAzI847.png)
評論