如何在视频帧上绘制边界和质心,在step()函数内部调用

时间:2017-01-27 12:34:34

标签: matlab image-processing computer-vision image-segmentation matlab-cvst

我在for循环中调用一些图像,然后对这些图像进行一些处理。之后,我使用step函数在视频播放器中显示这些帧及其掩码。如何在蒙版图像中为对象添加边界?另外,如何使边界更粗并在掩模图像中绘制掩模中每个斑点的质心?下面是代码的草图。

   videoPlayer = vision.VideoPlayer();
   maskPlayer = vision.VideoPlayer();
  for ii = 1:nfiles
  filenameii = [............]
  frame= imread(filenameii);
  mask = dOB(frame,BackgroundImg);
% some processing on the images
  mask= bwareaopen(mask,27);
  boundaries = bwboundaries(mask,'noholes');
  B=boundaries{1};
  Centroid = regionprops(mask,'centroid');
  Centroids = cat(1, Centroid.Centroid);
  plot(B(:,2),B(:,1),'g','LineWidth',3);
  plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10);  step(videoPlayer,frame);
  step(maskPlayer, mask); 

P.S:我知道如何使用hold on在图形上显示它,但我希望在图像上直接显示它,然后再将其显示在视频播放器中。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:2)

在视频播放器中显示像素之前,首先只需在面具上绘制像素。你有什么工作,但它将绘制掩模播放器图中的边界。因此,请从bwboundaries获取您检测到的边界,从这些坐标创建线性索引,并将图像中的值设置为白色。更简单的方法是使用您检测到的掩码并使用bwperim自动生成包含斑点边界的掩码。我也看到你正在填充面具的孔,所以你可以直接在后处理的输出上使用imfill,这样它就会给你一个图像而不是坐标。然后,您可以使用此蒙版直接索引到图像中,并将斑点边界的坐标设置为所需的颜色。如果您希望使周边更厚,使用适当大小的方形结构元素imdilate进行简单的图像扩张将有所帮助。只需将此结构元素的邻域大小定义为您所需的周长。最后,如果要将质心插入到蒙版中,并且因为您拥有MATLAB计算机视觉系统工具箱,请使用insertMarker功能,以便您可以为每个质心使用一组点并将它们直接放在图像中。但是,您必须确保将掩码从logical更改为更适合图像的数据类型。 uint8应该有效。因此,将图像转换为此类型,然后将所有非零值乘以255,以确保在蒙版中保持白色。使用insertMarker,您希望插入大小为10的红色加号,因此我们需要确保调用insertMarker来反映这一点。此外,因为你想要一个彩色图像,你必须人工制作颜色的颜色,并为每个平面单独绘制你想要的颜色。由于您需要绿色,因此对应于(0,255,0)的RGB值。

因此,我已修改您的代码,以便它执行此操作。另外,我计算了填充蒙版的质心而不是原始蒙版。我们不想错误地报告有间隙的物体的质心......除非这是你的目标,但让我们假设你不是:

videoPlayer = vision.VideoPlayer();
maskPlayer = vision.VideoPlayer();

% New - Specify colour you want
clr = [0 255 0]; % Default is green

% New - Define thickness of the boundaries in pixels.
thickness = 3;

% New - Create structuring element
se = strel('square', thickness);

for ii = 1:nfiles
    filenameii = [............]
    frame = imread(filenameii);
    mask = dOB(frame, BackgroundImg);
    % some processing on the images
    mask = bwareaopen(mask,27);
    %boundaries = bwboundaries(mask,'noholes');
    %B=boundaries{1};

    % New code - fill in the holes
    mask = imfill(mask, 'holes');

    Centroid = regionprops(mask,'centroid');    

    % New code - Create a boundary mask
    mask_p = bwperim(mask, 8);

    % New code - Make the boundaries thicker
    mask_p = imdilate(mask_p, se);

    % New code - create a colour image out of the mask
    [red, green, blue] = deal(255*uint8(mask));

    % Paint the perimeter of the blobs in the desired colour
    red(mask_p) = clr(1); green(mask_p) = clr(2); blue(mask_p) = clr(3);        

    Centroids = cat(1, Centroid.Centroid);
    %plot(B(:,2),B(:,1),'g','LineWidth',3);
    %plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10);  

    % New - Make mask into RGB image for marker painting and to 
    % show to the user
    mask_p = cat(3, red, green, blue);

    % New - Insert the centroids directly in the mask image
    mask_p = insertMarker(mask_p, Centroids, '+', 'color', 'r', 'size', 10);

    step(videoPlayer, frame);

    % New - Show new mask in the player
    step(maskPlayer, mask_p); 
end