Multimediální technologie – Cvičení 8


Zadání

Naprogramujte 4 metody vhodné pro vizuální segmentaci video streamu:

  • Metodu založenou na obrazových bodech počítanou jako rozdíl sum hodnot obrazových bodů v následujících snímcích.
  • Metodu založenou na obrazových bodech počítanou jako sumu rozdílu hodnot obrazových bodů v následujících snímcích.
  • Histogramově založenou metodu příznakově založenou metodu při využití DCT, využijte 5 nejvyšších koeficientů, koeficienty normalizujte logaritmem.

Výsledek zobrazujte v reálném čase, kde obraz bude vkládán do grafu. V grafu zobrazte i hranice segmentů, které jsou mezi snímky 209-210 a 269-270.

Ukázka

Ukázka

Soubory

Užitečné

plt.hold(False)
for i in range(1, 305):
ret = 'a%.3d.bmp' %i
bgr = cv2.imread(ret)
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
plt.imshow(rgb, aspect='auto', extent = [min(t), max(t), vec1.min(), vec1.max()])
plt.hold(True)
plt.plot(t, vs, linewidth=2, color='r')
plt.plot(t, vec1, linewidth=2, color='b')
l = plt.axvline(x=i, linewidth=2, color='g')
plt.axis([min(t), max(t), min(vec1), max(vec1)])
plt.hold(False)
pause(0.001)

Řešení

# -*- coding: utf-8 -*-
import os
import numpy as np
import matplotlib.pyplot as plt
import cv2

clear = lambda: os.system('cls')
clear()
plt.close('all')

def segSumDiff():
    result = np.zeros(304)

    for i in range(1, 305):
        ret = 'vid/a%.3d.bmp' %i
        bgr = cv2.imread(ret)
        gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

        frame = float(np.sum(gray))

        if i > 1:
            result[i-1] = np.abs(frame - frame1)
        else:
            result[i-1] = 0

        frame1 = frame

    startVideo(result, 1, 2)

def segSumValDiff():
    result = np.zeros(304)

    for i in range(1, 305):
        ret = 'vid/a%.3d.bmp' %i
        bgr = cv2.imread(ret)
        gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

        frame = gray.astype(float)

        if i > 1:
            temp = np.subtract(frame, frame1)
            temp = np.abs(temp)

            result[i-1] = np.sum(temp)
        else:
            result[i-1] = 0

        frame1 = frame

    startVideo(result, 2, 2)

def segHist():
    result = np.zeros(304)

    for i in range(1, 305):
        ret = 'vid/a%.3d.bmp' %i
        bgr = cv2.imread(ret)
        gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)

        hist, b = np.histogram(gray,256,[0,256])
        temp1 = 0

        if i > 1:
            temp = np.subtract(hist, hist1)
            temp = np.abs(temp)

            for j in range(0,255):
                temp1 += temp[j] * j

            result[i-1] = temp1
        else:
            result[i-1] = 0

        hist1 = hist
    startVideo(result, 3, 2)

def segIndex():
    last_vect = np.zeros((5), dtype=np.float)
    directory = 'vid'
    result_vector = np.zeros((os.listdir(directory).__len__()), dtype=np.float)
    i = 0

    for filename in os.listdir(directory):
        bgr = cv2.imread(directory + "/" + filename)
        grey = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY).astype(np.float)
        dct_pict = cv2.dct(grey.astype(float)) ** 2
        sorted_pic = np.sort(dct_pict, axis=None, kind='quicksort')
        vect = np.log([sorted_pic[-1], sorted_pic[-2], sorted_pic[-3], sorted_pic[-4], sorted_pic[-5]])
        result_vector[i] = sum(abs(vect - last_vect))
        last_vect = vect
        i = i + 1

    result_vector[0] = 0
    startVideo(result_vector, 4, 2)

def startVideo(result, fig_num, frames):
    t = range(1, 305)
    vs = np.zeros(304)
    vs[209] = max(result)
    vs[269] = max(result)

    plt.figure(fig_num)

    plt.hold(False)
    for i in range(1, frames):
        ret = 'vid/a%.3d.bmp' %i
        bgr = cv2.imread(ret)
        rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
        plt.imshow(rgb, aspect='auto', extent = [min(t), max(t), result.min(), result.max()])
        plt.hold(True)
        plt.plot(t, vs, linewidth=2, color='r')
        plt.plot(t, result, linewidth=2, color='b')
        l = plt.axvline(x=i, linewidth=2, color='g')
        plt.axis([min(t), max(t), result.min(), result.max()])
        plt.hold(False)
        plt.pause(0.001)

def main():
    segSumDiff()
    segSumValDiff()
    segHist()
    segIndex()

if __name__ == '__main__':
    main()

Napsat komentář