找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5333|回復(fù): 9
收起左側(cè)

火焰識別Python源碼(附帶QT界面)opencv QT5環(huán)境

  [復(fù)制鏈接]
ID:610753 發(fā)表于 2021-4-18 15:59 | 顯示全部樓層 |閱讀模式

火焰識別源碼,親測有用,下載后需要搭建opencv  QT5的環(huán)境。不懂得話可以私聊我


  1. # -*- coding: cp936 -*-
  2. import sys
  3. import threading #線程模塊
  4. import cv2
  5. import numpy as np
  6. import time
  7. import os
  8. import sys
  9. from PyQt5 import Qt
  10. from PyQt5 import QtCore
  11. from PyQt5.QtGui import QImage, QPixmap,QFont,QIcon
  12. from PyQt5.QtWidgets import (QApplication,QDialog, QFileDialog, QGridLayout,
  13.                 QLabel, QPushButton,QHBoxLayout,QFrame,QWidget,QLineEdit)



  14. font = cv2.FONT_HERSHEY_SIMPLEX #設(shè)置字體

  15. class Work(threading.Thread):
  16.     def __init__(self, caller):
  17.         threading.Thread.__init__(self)
  18.         self.caller = caller #父類調(diào)用者
  19.         self.isHaveFire = False #全局變量是否檢測到火焰
  20.         
  21.     def run(self): #線程啟動后自動調(diào)用此函數(shù)
  22.         cap = cv2.VideoCapture()#初始化VideoCapture類對象
  23.         if(self.caller.video_flag == 1):#標(biāo)志位為1,對應(yīng)打開攝像頭
  24.             cap = cv2.VideoCapture(0)  #打開攝像頭
  25.             print("打開攝像頭")
  26.         else: #標(biāo)志位為1,對應(yīng)打開視頻文件
  27.             cap = cv2.VideoCapture(self.caller.video_path)#打開對應(yīng)路徑的視頻文件
  28.             print("打開視頻文件%s"%self.caller.video_path)
  29.         while(1):
  30.             if(self.caller.flag): #如果視頻結(jié)束標(biāo)志位為1,則退出并清空圖像
  31.                 bgImg = np.ones((640,480,3),np.uint8)*240
  32.                 self.showViewImg(self.caller.label, bgImg)
  33.                 break
  34.             ret, frame = cap.read() #讀取視頻或攝像頭幀
  35.             if(ret==False):#取幀失敗,提示退出循環(huán)
  36.                 print("攝像頭打開失!" )
  37.                 break
  38.             time.sleep(0.001)
  39.             frame = self.fire_detect(frame)#調(diào)用火焰檢測函數(shù)
  40.             
  41.             frameTest = frame.copy()#原圖備份
  42.             self.showViewImg(self.caller.label, frame)
  43.             
  44.         cap.release()#釋放VideoCapture類對象

  45.     def showViewImg(self,label,img):
  46.         # 提取圖像的尺寸和通道, 用于將opencv下的image轉(zhuǎn)換成Qimage
  47.         #self.label.clear()
  48.         channel = 1
  49.         height = width = 1
  50.         try:
  51.             height, width, channel = img.shape
  52.         except:
  53.             channel = 1
  54.         showImg = None
  55.         if channel != 3:
  56.             showImg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
  57.         else:
  58.             showImg = img.copy()
  59.         
  60.         bytesPerLine = 3 * width
  61.         qImg = QImage(showImg.data, width, height, bytesPerLine,
  62.                            QImage.Format_RGB888).rgbSwapped()

  63.         # 將Qimage顯示出來
  64.         label.setPixmap(QPixmap.fromImage(qImg))
  65.         
  66.     def img_detect(self,img):#加載圖片檢測火焰
  67.         print("Image Test")
  68.         frame = self.fire_detect(img)#調(diào)用檢測火焰函數(shù)
  69.         self.showViewImg(self.caller.label, frame)
  70.         
  71.          
  72.     def fire_detect(self,frame): #火焰檢測函數(shù),核心算法
  73.         self.isHaveFire = False #初始化火焰檢測結(jié)果標(biāo)志位False
  74.         redThres = 49 #紅色閾值
  75.         sat = 7 #比例系數(shù)
  76.         blackImg = np.zeros((frame.shape[0],frame.shape[1],1),np.uint8)#創(chuàng)建原圖同大小的黑色圖像
  77.         b,g,r = cv2.split(frame)#通道分離
  78.         for i in range(0,frame.shape[0]): #訪問所有行
  79.             for j in range(0,frame.shape[1]): #訪問所有列
  80.                 B = int(b[i,j])#訪問第i行,第j列藍(lán)色像素值
  81.                 G = int(g[i,j])#訪問第i行,第j列綠色像素值
  82.                 R = int(r[i,j])#訪問第i行,第j列紅色像素值
  83.                 maxValue = max(max(B,G),R)#求RBG像素最大值
  84.                 minValue = min(min(B,G),R)#求RBG像素最小值
  85.                 if (R+G+B) == 0:
  86.                     break
  87.                 S = (1-3.0*minValue/(R+G+B))#計算S值
  88.                 if(R>redThres and R>=G and G>=B and S>((255-R)*sat/redThres)):#火焰像素刪選
  89.                    blackImg[i,j] = 255 #滿足火焰像素,黑色圖像對應(yīng)位置變?yōu)榘咨?br />
  90.                 else:
  91.                    blackImg[i,j] = 0 #不滿足火焰像素,黑色圖像對應(yīng)位置仍為黑色
  92.         blackImg = cv2.medianBlur(blackImg,5)#中值濾波濾除小雜訊
  93.         k1=np.ones((5,5), np.uint8)#指定膨脹核大小5*5
  94.         blackImg = cv2.dilate(blackImg, k1, iterations=1)#膨脹
  95.         #查找火焰部分輪廓
  96.         contours,hierarchy = cv2.findContours(blackImg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
  97.         index = -1
  98.         maxArea = 0
  99.         for i in range (0,len(contours)):#遍歷輪廓
  100.             (x0, y0, w0, h0) = cv2.boundingRect(contours[i])#獲取輪廓外界矩形
  101.             if(w0>10 and h0>10):#刪選外界矩形寬高均大于10
  102.                 #cv2.rectangle(frame,(x0,y0),(x0+w0,y0+h0),(0,255,0),2)
  103.                 if(w0*h0>maxArea):#比對輪廓面積
  104.                     maxArea = w0*h0 #獲取最大面積
  105.                     index = i #獲取最大面積對應(yīng)的輪廓序號
  106.         if index != -1: #輪廓序號變化了說明沒檢測到火焰
  107.             area = cv2.contourArea(contours[index])#獲取火焰輪廓對應(yīng)的面積
  108.             cv2.putText(frame,("FireArea=%0.2f"%(area)), (5,20), font, 0.7, (0,255,0), 2)#圖片上輸出面積
  109.             (x0, y0, w0, h0) = cv2.boundingRect(contours[index])#獲取外界矩形
  110.             cv2.rectangle(frame,(x0,y0),(x0+w0,y0+h0),(0,255,0),2)#繪制外界矩形框出火焰區(qū)域
  111.             self.isHaveFire = True #檢測到火焰標(biāo)志位為True,對應(yīng)會播放聲音
  112.             
  113.         else: #輪廓序號沒變說明沒檢測到火焰
  114.             cv2.putText(frame,("FireArea=0"), (5,20), font, 0.7, (0,255,0), 2)#火焰面積為0
  115.         return frame #返回最終處理后的圖像
  116.         

  117. if __name__=="__main__":
  118.     pass
復(fù)制代碼

51hei.png

火焰識別源碼.rar

4.06 KB, 下載次數(shù): 60, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:242753 發(fā)表于 2021-5-12 13:12 | 顯示全部樓層
現(xiàn)在好多python代碼,早知道不學(xué)C語言了
回復(fù)

使用道具 舉報

ID:940457 發(fā)表于 2021-6-19 15:08 | 顯示全部樓層

現(xiàn)在好多python代碼,早知道不學(xué)C語言了
回復(fù)

使用道具 舉報

ID:940457 發(fā)表于 2021-6-19 15:09 | 顯示全部樓層

現(xiàn)在好多python代碼,早知道不學(xué)C語言了
回復(fù)

使用道具 舉報

ID:974144 發(fā)表于 2021-10-22 14:41 | 顯示全部樓層

現(xiàn)在好多python代碼,早知道不學(xué)C語言了
回復(fù)

使用道具 舉報

ID:661945 發(fā)表于 2022-1-29 16:14 | 顯示全部樓層
圖像識別方面的吧~~~
回復(fù)

使用道具 舉報

ID:171525 發(fā)表于 2022-4-14 17:04 | 顯示全部樓層
PYTHON 都有哪些庫?
回復(fù)

使用道具 舉報

ID:512969 發(fā)表于 2022-4-16 08:49 | 顯示全部樓層
具體怎么使用啊樓主
回復(fù)

使用道具 舉報

ID:58930 發(fā)表于 2022-4-20 20:15 | 顯示全部樓層
建議樓主寫一個程序流程,相比會更完美,同時增強自己的文字功底。
回復(fù)

使用道具 舉報

ID:786205 發(fā)表于 2022-5-10 10:01 | 顯示全部樓層
您好 我在Ubuntu系統(tǒng)里運行您的代碼 報錯了,錯誤如下:
QObject::moveToThread: Current thread (0x107c340) is not the object's thread (0x1745370).
Cannot move to target thread (0x107c340)

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/wyh/.local/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.
您看這該如何解決
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表