Amazing-Python-Scripts
127 строк · 4.2 Кб
1#! /usr/bin/env python
2# coding=utf-8
3
4# ++++++++++++++++++++++++++++++++++++++++++++++++++
5# 存在的问题:
6# 1.RGB下火焰像素点的规律未掌握
7# 2.程序现在的运行速度是每祯处理2秒
8#
9# 先灰度化,二值化,中值滤波,开运算,
10# 根据颜色找火焰区域,画轮廓
11#
12# author:stone 2015.08.30
13# ++++++++++++++++++++++++++++++++++++++++++++++++++
14
15import numpy as np16import cv217import time18
19tStart = time.time()20# ++++++++++++++++++++++获取视频+++++++++++++++++++++
21vName = 'videos/forest1.avi'22# Boat_Fire_Stream.wmv
23# controlled3.avi
24# Extreme_Fire_Scenes_Stream.wmv
25# forest1.avi
26# forest2.avi
27
28cap = cv2.VideoCapture(vName)29
30# +++++++++++++++++++++处理视频++++++++++++++++++++++
31while True:32ret, frame = cap.read()33if frame is None:34print("视频读取完毕")35break36gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)37# hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)38ret, binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)39height, width = binary.shape40npframe = np.array(frame)41# nphsv = np.array(hsv)42npbinary = np.array(binary)43# +++++++++++++++++++++去噪+++++++++++++++++++++++++44# 二维卷积45# kernel = np.ones((5, 5), np.float32)/2546# dst = cv2.filter2D(binary, -1, kernel)47
48# 中值模糊49dst = cv2.medianBlur(binary, 5)50
51# 高斯模糊52# dst = cv2.GaussianBlur(binary, (5, 5), 0)53
54# 均值模糊55# dst = cv2.blur(binary, (5, 5))56
57# +++++++++++++++做开运算(先腐蚀再膨胀)除噪点++++++++++++58kernal2 = np.ones((5, 5), np.uint8)59opening = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernal2)60openning2 = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernal2)61
62# +++++++++++++++判断亮点颜色是否R >= G > B+++++++++++++63binary_x = 064Rt = 13565St = 5566while binary_x < height:67binary_y = 068while binary_y < width:69if (opening[binary_x, binary_y] == 255):70p = npframe[(binary_x, binary_y)]71# p2 = hsv[(binary_x, binary_y)]72# ??????怎么转换到hsv颜色空间,然后再增加一条限制: S >= ((255-R)*ST/RT)73# ??????加上S限制之后效果不好,可能是S有误,需要研究一下HSV 或者 HSI 或者其他有S的颜色空间74if p[2] >= p[1] >= p[0]: # & p2[2] >= 5:75binary_y += 176continue77else:78opening[binary_x, binary_y] = 079binary_y += 180binary_x += 181# +++++++++++++++显示高亮区域轮廓+++++++++++++++++++++++82image, contour, hierarchy = cv2.findContours(opening,83cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)84if contour == []:85print('无轮廓')86else:87# 在视频窗口中显示轮廓88cv2.drawContours(frame, contour, -1, (0, 0, 255), 2)89
90# +++++++++++++++图像中的点是否在轮廓内++++++++++++++++++++91
92# ???无轮廓时索引异常93# if np.array(contour)[0] == None:94# print '无轮廓'95# else:96# npcontour = np.array(contour)[0]97# npframe = np.array(frame)98# t = time.time()99# for x in xrange(height):100# for y in xrange(width):101# inContour = cv2.pointPolygonTest(npcontour, (x, y), False)102# if (inContour > 0):103# print npframe[(x, y)]104# t1 = time.time()105# print t - t1106
107# ++++++++++++++++++++++显示视频++++++++++++++++++++++108cv2.imshow('frame', frame) # 原图像109cv2.imshow('binary', binary)110# cv2.imshow('hsv', hsv)111# cv2.imshow('contour', opening) #开运算图像112# cv2.imshow('opening2', openning2) #中值模糊图像113tEnd = time.time()114totalTime = (tEnd - tStart)115print(tStart)116print(tEnd)117print('总时间 %d ' % totalTime)118if cv2.waitKey(1) & 0xFF == 27:119print('中止播放')120break121# tEnd = time.time()
122
123cap.release()124cv2.destroyAllWindows()125# totalTime = (tEnd - tStart)
126print(time.clock())127# print '总时间 %d ' % totalTime
128