0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在核桃派上實現(xiàn)USB攝像頭的OpenCV顏色檢測

全志在線 ? 來源:walnutpi ? 2024-01-20 17:50 ? 次閱讀

在前幾周的文章中已經(jīng)介紹過如何在核桃派上用OpenCV讀取圖像并顯示到pyqt5的窗口上,這里在上一篇文章的基礎上,給開發(fā)板加入顏色檢測功能,嘗試將圖像中所有藍色的東西都用一個框標記出來。

顏色檢測核心api

按照慣例,先要介紹一下opencv中常用的hsv像素格式。顏色還是那個顏色,只是描述顏色用的參數(shù)變了。h代表色調(diào),s代表飽和度,v代表明度,比使用rgb格式更方便計算與思考。

29ce6f4c-b768-11ee-8b88-92fbcf53809c.png

opencv中也提供了將rgb bgr等轉(zhuǎn)為hsv圖片的api:

hsvImage = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

cv2.inRange,給定一個要檢測的hsv顏色范圍,返回一張黑白圖。將hsv值在該范圍內(nèi)的像素點全部變?yōu)榘咨?,不在的則為黑色。

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ì)反光導致拍出來也有一些部分的顏色變了。所以實際應用時需要對圖像進行一些濾波模糊化處理。或是直接對生成后的黑白圖像進行一定膨脹與收縮。

29f0acec-b768-11ee-8b88-92fbcf53809c.png

再把各個參數(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)

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7773

    瀏覽量

    262379
  • 攝像頭
    +關(guān)注

    關(guān)注

    59

    文章

    4752

    瀏覽量

    94391
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41089

原文標題:在核桃派上實現(xiàn)USB攝像頭的OpenCV顏色檢測

文章出處:【微信號:gh_79acfa3aa3e3,微信公眾號:全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測

    理論知識,因此初學者也能輕松跟著步驟實現(xiàn)。 項目所需設備 硬件: 樹莓派 3 Model B; 樹莓派攝像頭模塊(PiCam)。 語言和庫: OpenCV Python 3 步驟 本文主要講述如何使用 PiCam
    的頭像 發(fā)表于 03-06 09:00 ?5.1w次閱讀

    全志H616核桃派上實現(xiàn)USB攝像頭OpenCV顏色檢測

    在給核桃派開發(fā)板用OpenCV讀取圖像并顯示到pyqt5的窗口上并加入顏色檢測功能,嘗試將圖像中所有藍色的東西都用一個框標記出來。顏色
    發(fā)表于 01-22 10:10

    使用esp-iot-solution master分支的usb_stream攝像頭顏色不對是怎么回事?

    使用esp-iot-solution master分支的usb_stream 連接usb攝像頭顏色偏紅。這個攝像頭
    發(fā)表于 06-27 06:41

    OpenWRT + OpenCV 無線攝像頭監(jiān)控和圖像處理

    誕生了。【步驟:路由】路由器上的原材料:703n固件mjpeg-streamer軟件免驅(qū)攝像頭(筆者使用的是某寶上淘來的東芝筆記本拆機攝像頭)首先要實現(xiàn)圖像傳輸需要在路由上掛載USB
    發(fā)表于 02-09 22:15

    【OK210試用體驗】之(五)——Ubuntu12.04安裝OpenCV2.4.9并實現(xiàn)USB攝像頭C270圖像采集

    邁進。今天帖子的主要內(nèi)容就是Ubuntu12.04上安裝圖像處理軟件OpenCV,并用簡單的程序實現(xiàn)UVC攝像頭C270的圖像采集。 硬件平臺:Windows7 64 bit +
    發(fā)表于 08-02 12:21

    NanoPi 2接USB攝像頭使用OpenCV

    `NanoPi 2接USB攝像頭使用OpenCVOpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫。NanoPi 2跑Debian
    發(fā)表于 12-24 18:34

    Nanopi M3 u***攝像頭使用opencv

    首先先準備好器材1.M3板子2.燒寫好debian系統(tǒng)的sd卡3.lcd屏 (我用的是x710的電容屏,7寸的)4.USB(FA-CAM202)200萬攝像頭模塊啟動系統(tǒng)后:OpenCV的全稱
    發(fā)表于 10-11 15:42

    【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組試用體驗】開箱報告

    ` 經(jīng)過申請,收到了雙目攝像頭,這次主要是通過雙目攝像頭搭載linux操作系統(tǒng),基于Qt+Opencv庫進行圖形算法的識別。本次很榮幸可以參加這次的試用體驗活動。好了,下面就開始對USB
    發(fā)表于 09-02 09:52

    【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組試用體驗】使用opencv打開攝像頭

    因為我們使用的是Qt+opencv 進行攝像頭項目環(huán)境的搭建去對雙目攝像頭進行測試。目前我用的是Qt5, opencv 使用的是oepcv3.4
    發(fā)表于 09-26 21:54

    【大聯(lián)大友尚安森美半導體感光芯片USB雙目攝像頭模組測試三】--寵物機器人攝像頭人臉采集和識別

    鏡頭,2是右側(cè)鏡頭,之后會優(yōu)化本項目代碼,將兩個攝像頭共同調(diào)用協(xié)同處理采集的畫面,這里主要以實現(xiàn)調(diào)用和人臉檢測為目的。暫不累述。2人臉識別及背光調(diào)節(jié)這里主要是面對項目寵物小車多光源環(huán)
    發(fā)表于 10-20 00:16

    STM32單片機如何實現(xiàn)連接USB攝像頭

    STM32單片機實現(xiàn)連接USB攝像頭如題,本人已經(jīng)實現(xiàn)STM32連接基于Cypress CY7C68013A的攝像頭電路板的方案,具體
    發(fā)表于 07-19 06:20

    如何去實現(xiàn)一種基于opencv與flask的攝像頭圖像傳輸呢

    硬件:eaidk610(fedaro28)、普通帶usb接口攝像頭軟件環(huán)境: python3.9、opencv4.6、Flask2.2主要實現(xiàn)了從板子的連接的
    發(fā)表于 10-18 14:25

    STM32單片機實現(xiàn)連接USB攝像頭

    STM32單片機實現(xiàn)連接USB攝像頭如題,本人已經(jīng)實現(xiàn)STM32連接基于Cypress CY7C68013A的攝像頭電路板的方案,具體
    發(fā)表于 11-18 20:51 ?145次下載
    STM32單片機<b class='flag-5'>實現(xiàn)</b>連接<b class='flag-5'>USB</b><b class='flag-5'>攝像頭</b>

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

    程序功能: 子線程里打開攝像頭,獲取攝像頭的數(shù)據(jù),通過信號與槽的方式,將攝像頭數(shù)據(jù)傳遞給主UI界面實時顯示,采用定時器每100ms取一次
    的頭像 發(fā)表于 08-14 09:29 ?1800次閱讀
    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>)

    USB攝像頭解決方案

    攝像頭大家應該都不陌生,但USB攝像頭大家見過么? 近期USB攝像頭火了起來,與手機連接后可以
    的頭像 發(fā)表于 08-28 23:06 ?1625次閱讀
    <b class='flag-5'>USB</b><b class='flag-5'>攝像頭</b>解決方案