簡體   English   中英

如何在Matlab中為視頻繪制邊框

[英]How to draw a bounding box for a video in Matlab

我有興趣知道如何獲得一個邊界框來檢測視頻中的斑點。 我的代碼涉及背景減法,並且我正在使用簡單的函數:

clc
clear all
close all

m=0; n=0;

readerobj = mmreader('dt2.wmv');% dt2 is my sample fixed cam video
vidframes = read(readerobj);

thresh = 15;

bg = read(readerobj,1);
bg_bw = double(rgb2gray(bg));

fr_size = size(vidframes);
width = fr_size(2);
height = fr_size(1);

fg = zeros(height, width);
numFrames=get(readerobj,'NumberofFrames');

for k = 1 : numFrames
    mov(k).cdata = vidframes(:,:,:,k);
    mov(k).colormap = [];
end

movie(mov, 1, readerobj.FrameRate)

a=1; x=[0 0]; p=0; c=0; 

for i = 2:2:numFrames
    fr = read(readerobj,i); 
    fg = zeros(size(fr));
    fr_bw = rgb2gray(fr);       
    fr_diff = abs(double(fr_bw) - double(bg_bw));  
    for j=1:width                 
      for k=1:height
         if ((fr_diff(k,j) > thresh))
             fg(k,j) = 255; %fr_bw(k,j)
         else
             fg(k,j) = 0;
         end
         if (fr_bw(k,j) > bg_bw(k,j))          
           bg_bw(k,j) = bg_bw(k,j) + 1;           
         elseif (fr_bw(k,j) < bg_bw(k,j))
           bg_bw(k,j) = bg_bw(k,j) - 1;     
         end
     end    

    %median filter to remove noise
    L=medfilt2(fg,[5,5]);            

    %removing small parts less than threshold area
    final=bwareaopen(L,4000);               

    %filling the holes
    ifill=imfill(final,'holes');          

    %to know the number of connected objects
    [Ilabel num]=bwlabel(ifill);          

    if (num>=1)
       %region properties of the image
       Iprops=regionprops(Ilabel);            
       %extracting the bounding box properties
       Ibox=[Iprops.BoundingBox]; 
    end
% ????? What do I do next?
end

在此之后,我正在尋找可以連續在Blob周圍繪制邊界框的代碼。

如果您查看BoundingBox屬性的屬性,則有兩個字段:

  • ul_corner表示邊界框的左上角
  • width -表示的寬度在每一維

如果要處理單個幀,通常這是一個4元素向量。 這樣,前兩個元素為您提供圖像左上角的(x,y)坐標,而后兩個元素為您提供每個維度上的寬度。

假設您的BoundingBox屬性為您提供了此功能:

[1 2 11 14]

這意味着左上角位於(x,y) = (1,2) ,寬度為11,高度為14。請記住, x坐標從左到右水平跨度,而y co -縱坐標從上到下垂直跨度。

最終獲得此BoundingBox屬性時,如Ibox=[Iprops.BoundingBox]; 語句,您可以使用rectangle命令輕松地將邊界框疊加到框架上。 但是,請記住, regionprops函數可能返回多個區域。 我不確定您的總體目標是什么,但是調用Iprops.BoundingBox並將其封裝在方括號中會將所有包圍盒屬性作為單個向量返回。 我建議重塑它,使其成為一個N x 4矩陣:

Ibox = reshape(Ibox, 4, length(Iprops))';

這樣,第i行將為您提供圖像中第i個對象的邊界框。

使用幀的fr變量,只需執行以下操作(假設我們正在描繪圖像中的第一個對象):

imshow(fr);
hold on;
rectangle('Position', Ibox(1,:), 'EdgeColor', 'r');

rectangle命令有兩個參數(如果要修改其屬性,可以選擇兩個參數):您可以指定是否要使用第一個參數的規則矩形,圓角矩形或橢圓形,並為第二個參數指定尺寸矩形的 由於需要邊界框,因此選擇“ Position作為第一個參數,第二個參數是一個4元素向量,表示邊界框的左上角,其后是寬度和高度。

方便地 ,這是已經由regionprops結構中的BoundingBox屬性指定的,因此您只需要替換Ibox 。您可以為框指定所需的顏色。 我選擇紅色( r )以使其突出。

現在,如果要連續顯示每個幀,只需顯示每個圖像,然后每次調用rectangle函數。

作為示例,讓我們使用內置的MATLAB圖像並為每個形狀提取相關的邊界框。

BW = imread('text.png');
s  = regionprops(BW);

這是一個包含一堆文本的內置圖像。 第二條MATLAB語句將嘗試為每個字符提取所有相關的邊界框。 s將返回一個88元素的結構。 現在,讓我們圍繞檢測到的前三個字符繪制邊界框:

b1 = s(1).BoundingBox;
b2 = s(2).BoundingBox;
b3 = s(3).BoundingBox;

imshow(BW);
hold on;
rectangle('Position', b1, 'EdgeColor', 'r');
rectangle('Position', b2, 'EdgeColor', 'g');
rectangle('Position', b3, 'EdgeColor', 'c');

...這就是我得到的。 我已將一個邊界框定為紅色,一個定界為綠色,另一個定為青色。

在此處輸入圖片說明

如果要針對單個框架自動執行此操作,請執行以下操作(假設您進行了我告訴過的重塑操作), 並將其放置在代碼中的問號處:

Ibox = reshape(Ibox, 4, length(Iprops))';
imshow(fr);
hold on;
for k = 1 : size(Ibox, 1)
   rectangle('Position', Ibox(k,:), 'EdgeColor', 'r');
end

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM