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

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

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

使用圖像處理庫(kù)OpenCV從攝像頭獲取數(shù)據(jù)并在PyQt5上顯示出來

全志在線 ? 來源:全志在線 ? 2024-01-05 17:32 ? 次閱讀

OpenCV能夠處理圖像、視頻、深度圖像等各種類型的視覺數(shù)據(jù),在某些情況下,盡管OpenCV可以顯示窗口,但PyQt5可能更適合用于創(chuàng)建復(fù)雜的交互式應(yīng)用程序,而自帶GPU的H618就成為了這些圖像顯示的最佳載體。

本文將實(shí)現(xiàn)的功能是使用圖像處理庫(kù)OpenCV從攝像頭獲取數(shù)據(jù),縮放后從PyQt5的窗口中顯示出來。

78f0162e-abac-11ee-8b88-92fbcf53809c.png

創(chuàng)建pyqt5窗口

這里在電腦上使用designer軟件,創(chuàng)建一個(gè)Main Window類型窗體。從左邊組件欄中拖出一個(gè)label放到窗口中間。

點(diǎn)一下放在窗口中的label,在軟件右下角的屬性編輯器里可以設(shè)置很多東西,這里就不細(xì)介紹了。這里我是設(shè)置了QFrame啟用了邊框,QLabel中的texte屬性控制顯示的文本,QLabel中的alignment屬性控制文本對(duì)齊方式。

然后保存為.ui結(jié)尾的文件:

7915584e-abac-11ee-8b88-92fbcf53809c.png

隨后將designer繪制的ui文件轉(zhuǎn)化為py文件

python3 -m PyQt5.uic.pyuic ui_main.ui -o ui_main.py

接下來編寫main.py程序,調(diào)用剛剛畫的窗口進(jìn)行顯示,先把剛剛的ui_main.py以及一些qt庫(kù)給import進(jìn)來:

from ui_main import Ui_MainWindow


import PyQt5
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *


# 修正qt的plugin路徑,因?yàn)槟承┏绦颍╟v2)會(huì)將其改到其他路徑
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.dirname(PyQt5.__file__)

放入一點(diǎn)輔助代碼,一個(gè)是為了實(shí)現(xiàn)從遠(yuǎn)程命令行運(yùn)行qt程序顯示到桌面上,一個(gè)是為了在命令行下可以按ctrl+c快捷鍵來強(qiáng)制退出qt程序

#【可選代碼】允許遠(yuǎn)程運(yùn)行
import os
os.environ["DISPLAY"] = ":0.0"


#【建議代碼】允許終端通過ctrl+c中斷窗口,方便調(diào)試
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
timer = QtCore.QTimer()
timer.start(100) # You may change this if you wish.
timer.timeout.connect(lambda: None) # Let the interpreter run each 100 ms

加上調(diào)用函數(shù)進(jìn)行顯示的部分,這個(gè)顯示pyqt5窗口的基本程序就完成了

# 初始化窗口
import sys
app = QtWidgets.QApplication(sys.argv)
window = WINDOW()
ui = Ui_MainWindow()
ui.setupUi(window)
window.showFullScreen() #全屏顯示
# window.show() #按繪制時(shí)的尺寸顯示
sys.exit(app.exec_())
791f54c0-abac-11ee-8b88-92fbcf53809c.png

在核桃派lcd屏上的效果展示

OpenCV圖像讀取及顯示

調(diào)用頭文件,opencv的頭文件只需要這一個(gè)

import cv2

打開攝像頭,其中傳入的參數(shù)1是攝像頭編號(hào),一般是從0開始往后排

cap = cv2.VideoCapture(1)

從攝像頭讀取一幀圖像,ret是讀取狀態(tài),frame是圖像數(shù)據(jù)

ret, frame = cap.read()

cap.read函數(shù)讀到的是bgr格式的,為了把opencv的圖像數(shù)據(jù)顯示到qt的label,需要先轉(zhuǎn)為rgb格式,并將圖像轉(zhuǎn)為Qt中用來表示圖像的QImage。

rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)


h, w, ch = rgbImage.shape
qtImage = QImage(rgbImage.data, h, w, ch*w, QtGui.QImage.Format_RGB888)

label的setPixmap方法可以圖像數(shù)據(jù)覆蓋label

label.setPixmap(QPixmap.fromImage(qtImage))
79568e4a-abac-11ee-8b88-92fbcf53809c.png

顯示效果

線程,信號(hào)與槽

原代碼為了簡(jiǎn)單,沒有使用信號(hào)槽機(jī)制,不夠線程安全,我們這里使用qt自帶的多線程功能,他的使用很簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)類并繼承自QThread, 然后將要運(yùn)行的東西寫到類里的run方法下面。實(shí)例化一個(gè)對(duì)象后,調(diào)用start方法即可創(chuàng)建新線程

class Work(QThread):
  def run(self):
    pass
work = Work()
work.start()

直接在線程內(nèi)調(diào)用函數(shù)去修改qt窗口的內(nèi)容,不能滿足線程安全。

我們需要?jiǎng)?chuàng)建一個(gè)信號(hào),把修改qt窗口的語(yǔ)句寫到一個(gè)槽內(nèi),連接他們,在想修改窗口時(shí)發(fā)出信號(hào),讓qt內(nèi)部去調(diào)度,防止跟其他qt內(nèi)部的線程發(fā)生沖突。

78f0162e-abac-11ee-8b88-92fbcf53809c.png

因?yàn)槲覀冞@個(gè)線程類繼承自QThread,所以可以在類內(nèi)定義信號(hào)。只需要實(shí)例化一個(gè)pyqtSignal對(duì)象即可,調(diào)用時(shí)括號(hào)內(nèi)的參數(shù)決定了槽函數(shù)必須有什么類型的參數(shù),以及發(fā)送信號(hào)時(shí)需要傳入什么參數(shù)。

 signal_update_label = pyqtSignal( QPixmap)

槽函數(shù)就是隨便定義一個(gè)函數(shù),只要函數(shù)參數(shù)跟信號(hào)一樣就行。

 label:QLabel
  def sloat_update_label( self, pixmap:QPixmap):
    self.label.setPixmap(pixmap)

使用emit方法即可發(fā)送信號(hào),qt內(nèi)部會(huì)進(jìn)行調(diào)度,將所有連接到本信號(hào)的函數(shù)都調(diào)出來運(yùn)行,并將參數(shù)傳給他們。這是qt實(shí)現(xiàn)線程安全的重要機(jī)制。

self.signal_update_label.emit(QPixmap.fromImage(qtImage))

本文轉(zhuǎn)載自:https://forum.walnutpi.com/t/topic/84







審核編輯:劉清

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

    關(guān)注

    4

    文章

    794

    瀏覽量

    58299
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    623

    瀏覽量

    41177
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3388

原文標(biāo)題:可視可交互!H618上用OpenCV讀取圖像顯示到PyQt5窗口上

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    可視可交互!H618OpenCV讀取圖像顯示PyQt5窗口上

    這里分享一個(gè)代碼,功能是使用圖像處理庫(kù)opencv攝像頭
    發(fā)表于 01-10 09:55

    攝像頭采集圖像處理

    就可以做到實(shí)際中圖像處理并且做到無(wú)線傳輸。這樣的圖像采集處理功能在監(jiān)控系統(tǒng)和在線檢測(cè)都有很大的前景。 本作品是基于安芯一號(hào)SLH89F5162單片機(jī),驅(qū)動(dòng)并控制帶FIFO的OV7670
    發(fā)表于 11-05 22:35

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

    知道視頻流是jpeg類型,因此“偽造”了一個(gè)jpeg文件名下圖是修改OpenCV官網(wǎng)的一個(gè)demo,親測(cè)在路由獲取圖像可行(分別從筆記本攝像頭
    發(fā)表于 02-09 22:15

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

    邁進(jìn)。今天帖子的主要內(nèi)容就是在Ubuntu12.04安裝圖像處理軟件OpenCV,并用簡(jiǎn)單的程序?qū)崿F(xiàn)UVC攝像頭C270的
    發(fā)表于 08-02 12:21

    【Nanopi NEO試用體驗(yàn)】【機(jī)器學(xué)習(xí)/計(jì)算機(jī)視覺/NLP操作篇】USB攝像頭的使用以及ascii顯示攝像頭畫面

    去掉,只留下resize跟cvtcolor就是這樣了!那么這個(gè)圖片里是什么呢?相信大家已經(jīng)猜出來了!那么問題來了,這樣子做只是能夠把攝像頭捕捉的畫面以粗暴的方式顯示出來而已,而對(duì)于opencv
    發(fā)表于 10-29 15:40

    【新手求助】關(guān)于樹莓派+opencv+攝像頭圖像處理的問題?

    使用樹莓派3B,原裝攝像頭800W像素,c++和opencv。對(duì)亮斑進(jìn)行拍攝,并求取光斑重心。怎么能有效提高精度和速度?流程是這樣的:opencv控制攝像頭拍照;提取單通道像素值;
    發(fā)表于 11-09 08:57

    基于STM32單片機(jī)的攝像頭圖像采集的處理系統(tǒng)

    處理顯示系統(tǒng),完成了圖像的快速采集、存儲(chǔ)、數(shù)據(jù)處理圖像顯示。首先
    發(fā)表于 09-06 16:21

    如何攝像頭獲取圖像并保存和實(shí)時(shí)顯示

    開發(fā)環(huán)境,包括相關(guān)源的更新,庫(kù)的安裝,按照上次blog中的介紹,安裝好Python-opencv和導(dǎo)入cv2庫(kù)后,就可以進(jìn)行接下來我們今天的學(xué)習(xí)了,今天將叫大家進(jìn)一步實(shí)現(xiàn)如何
    發(fā)表于 09-25 15:15

    ov5640攝像頭采集的圖像顯示出來是錯(cuò)誤的

    `STM32板子ov5640攝像頭采集的JPEG數(shù)據(jù)圖像顯示出來是錯(cuò)誤的。這樣的問題因?yàn)槭裁??該如何修改呢?`
    發(fā)表于 04-16 21:12

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

    。因?yàn)楣庹盏牟煌瑫?huì)對(duì)識(shí)別的效果產(chǎn)生質(zhì)的影響。因?yàn)槟壳暗囊曈X系統(tǒng)只是認(rèn)為識(shí)別到的是一個(gè)多通道的平面圖像,而再此基礎(chǔ)做出了圖像處理(濾波,灰度等)
    發(fā)表于 09-26 21:54

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

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

    如何在OKMX6UL-C利用攝像頭圖像采集呢

    要求在OKMX6UL-C(emmc版本)利用攝像頭圖像采集、視頻采集,需要在LCD屏幕上將圖像或視頻顯示出來1. 請(qǐng)問該采用什么類型的
    發(fā)表于 12-02 06:49

    【EASY EAI Nano開源套件試用體驗(yàn)】3. OpenCV 圖像處理開發(fā)測(cè)試

    功的顯示出mipi攝像頭采集的視頻畫面和文件: 四、OpenCV 開發(fā)測(cè)試OpenCV是圖形圖像處理常用的一個(gè)工具,它提供了非常豐富的視覺
    發(fā)表于 03-08 00:03

    PyQt5的中文教程電子書免費(fèi)下載

     本教程的目的是帶領(lǐng)你入門PyQt5。教程內(nèi)所有代碼都在Linux測(cè)試通過。PyQt4 教程是PyQt4的教程,PyQt4是一個(gè)Pytho
    發(fā)表于 08-06 08:00 ?13次下載
    <b class='flag-5'>PyQt5</b>的中文教程電子書免費(fèi)下載

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

    在前幾周的文章中已經(jīng)介紹過如何在核桃派上用OpenCV讀取圖像顯示pyqt5的窗口上,這里在上一篇文章的基礎(chǔ),給開發(fā)板加入顏色檢測(cè)功能
    的頭像 發(fā)表于 01-20 17:50 ?836次閱讀
    在核桃派上實(shí)現(xiàn)USB<b class='flag-5'>攝像頭</b>的<b class='flag-5'>OpenCV</b>顏色檢測(cè)