Amazing-Python-Scripts

Форк
0
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

15
import numpy as np
16
import cv2
17
import time
18

19
tStart = time.time()
20
# ++++++++++++++++++++++获取视频+++++++++++++++++++++
21
vName = 'videos/forest1.avi'
22
# Boat_Fire_Stream.wmv
23
# controlled3.avi
24
# Extreme_Fire_Scenes_Stream.wmv
25
# forest1.avi
26
# forest2.avi
27

28
cap = cv2.VideoCapture(vName)
29

30
# +++++++++++++++++++++处理视频++++++++++++++++++++++
31
while True:
32
    ret, frame = cap.read()
33
    if frame is None:
34
        print("视频读取完毕")
35
        break
36
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
37
    # hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
38
    ret, binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)
39
    height, width = binary.shape
40
    npframe = np.array(frame)
41
    # nphsv = np.array(hsv)
42
    npbinary = np.array(binary)
43
    # +++++++++++++++++++++去噪+++++++++++++++++++++++++
44
    # 二维卷积
45
    #    kernel = np.ones((5, 5), np.float32)/25
46
    #    dst = cv2.filter2D(binary, -1, kernel)
47

48
    # 中值模糊
49
    dst = 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
    # +++++++++++++++做开运算(先腐蚀再膨胀)除噪点++++++++++++
58
    kernal2 = np.ones((5, 5), np.uint8)
59
    opening = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernal2)
60
    openning2 = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernal2)
61

62
    # +++++++++++++++判断亮点颜色是否R >= G > B+++++++++++++
63
    binary_x = 0
64
    Rt = 135
65
    St = 55
66
    while binary_x < height:
67
        binary_y = 0
68
        while binary_y < width:
69
            if (opening[binary_x, binary_y] == 255):
70
                p = 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的颜色空间
74
                if p[2] >= p[1] >= p[0]:  # & p2[2] >= 5:
75
                    binary_y += 1
76
                    continue
77
                else:
78
                    opening[binary_x, binary_y] = 0
79
            binary_y += 1
80
        binary_x += 1
81
    # +++++++++++++++显示高亮区域轮廓+++++++++++++++++++++++
82
    image, contour, hierarchy = cv2.findContours(opening,
83
                                                 cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
84
    if contour == []:
85
        print('无轮廓')
86
    else:
87
        #    在视频窗口中显示轮廓
88
        cv2.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 - t1
106

107
    # ++++++++++++++++++++++显示视频++++++++++++++++++++++
108
    cv2.imshow('frame', frame)  # 原图像
109
    cv2.imshow('binary', binary)
110
    # cv2.imshow('hsv', hsv)
111
    #    cv2.imshow('contour', opening)  #开运算图像
112
    #    cv2.imshow('opening2', openning2)          #中值模糊图像
113
    tEnd = time.time()
114
    totalTime = (tEnd - tStart)
115
    print(tStart)
116
    print(tEnd)
117
    print('总时间 %d ' % totalTime)
118
    if cv2.waitKey(1) & 0xFF == 27:
119
        print('中止播放')
120
        break
121
# tEnd = time.time()
122

123
cap.release()
124
cv2.destroyAllWindows()
125
# totalTime = (tEnd - tStart)
126
print(time.clock())
127
# print '总时间 %d ' % totalTime
128

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.