[英]how to crop the detected object in image with Object's bounding box using 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.