在前幾周的文章中已經(jīng)介紹過(guò)如何在核桃派上用OpenCV讀取圖像并顯示到pyqt5的窗口上,這里在上一篇文章的基礎(chǔ)上,給開發(fā)板加入顏色檢測(cè)功能,嘗試將圖像中所有藍(lán)色的東西都用一個(gè)框標(biāo)記出來(lái)。
顏色檢測(cè)核心api
按照慣例,先要介紹一下opencv中常用的hsv像素格式。顏色還是那個(gè)顏色,只是描述顏色用的參數(shù)變了。h代表色調(diào),s代表飽和度,v代表明度,比使用rgb格式更方便計(jì)算與思考。
opencv中也提供了將rgb bgr等轉(zhuǎn)為hsv圖片的api:
hsvImage = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.inRange,給定一個(gè)要檢測(cè)的hsv顏色范圍,返回一張黑白圖。將hsv值在該范圍內(nèi)的像素點(diǎn)全部變?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,傳入黑白圖像,尋找所有輪廓。返回兩個(gè)列表,contours里是找到的所有輪廓,hierarchy是那些輪廓之間的相對(duì)位置關(guān)系
contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
minAreaRect,傳入一個(gè)輪廓,計(jì)算最小外接矩形
# 畫最小外接矩形 for cts in contours : rect = cv2.minAreaRect(cts)
drawContours, 繪制輪廓
box = np.int0(cv2.boxPoints(rect)) cv2.drawContours(rgbImage, [box], 0, (255, 0, 0), 2)
基本測(cè)試代碼
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路徑,因?yàn)槟承┏绦颍╟v2)會(huì)將其改到其他路徑 import os os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.dirname(PyQt5.__file__) #【可選代碼】允許Thonny遠(yuǎn)程運(yùn)行 import os os.environ["DISPLAY"] = ":0.0" #【建議代碼】允許終端通過(guò)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)
由于攝像頭拍出來(lái)的噪點(diǎn)很多,而物體由于本身材質(zhì)反光導(dǎo)致拍出來(lái)也有一些部分的顏色變了。所以實(shí)際應(yīng)用時(shí)需要對(duì)圖像進(jìn)行一些濾波模糊化處理。或是直接對(duì)生成后的黑白圖像進(jìn)行一定膨脹與收縮。
再把各個(gè)參數(shù)做成pyqt窗口的選項(xiàng),查看各項(xiàng)搭配后的效果,快速找到合適的參數(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) # 腐蝕 # 獲取中心點(diǎn)的顏色,畫上十字光標(biāo) 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文章
8146瀏覽量
270938 -
攝像頭
+關(guān)注
關(guān)注
61文章
4951瀏覽量
97683 -
OpenCV
+關(guān)注
關(guān)注
32文章
642瀏覽量
42446
原文標(biāo)題:在核桃派上實(shí)現(xiàn)USB攝像頭的OpenCV顏色檢測(cè)
文章出處:【微信號(hào):gh_79acfa3aa3e3,微信公眾號(hào):全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
樹莓派上使用OpenCV和Python實(shí)現(xiàn)實(shí)時(shí)人臉檢測(cè)
在全志H616核桃派上實(shí)現(xiàn)USB攝像頭的OpenCV顏色檢測(cè)
使用esp-iot-solution master分支的usb_stream攝像頭顏色不對(duì)是怎么回事?
使用OpenCV保存從攝像頭捕獲的視頻時(shí)更改顏色輸出視頻收到警告怎么解決?
OpenWRT + OpenCV 無(wú)線攝像頭監(jiān)控和圖像處理
【OK210試用體驗(yàn)】之(五)——在Ubuntu12.04安裝OpenCV2.4.9并實(shí)現(xiàn)USB攝像頭C270圖像采集
NanoPi 2接USB攝像頭使用OpenCV
Nanopi M3 u***攝像頭使用opencv
【大聯(lián)大友尚安森美半導(dǎo)體感光芯片USB雙目攝像頭模組試用體驗(yàn)】開箱報(bào)告
【大聯(lián)大友尚安森美半導(dǎo)體感光芯片USB雙目攝像頭模組試用體驗(yàn)】使用opencv打開攝像頭
【大聯(lián)大友尚安森美半導(dǎo)體感光芯片USB雙目攝像頭模組測(cè)試三】--寵物機(jī)器人攝像頭人臉采集和識(shí)別
STM32單片機(jī)如何實(shí)現(xiàn)連接USB攝像頭
如何去實(shí)現(xiàn)一種基于opencv與flask的攝像頭圖像傳輸呢
STM32單片機(jī)實(shí)現(xiàn)連接USB攝像頭

Linux下QT+OpenCV實(shí)現(xiàn)人臉實(shí)時(shí)檢測(cè)(攝像頭)

評(píng)論