如何正确检测电影拍摄中移动的球?

信息处理 图像处理 边缘检测
2022-02-18 18:07:00

我在检测水槽中移动的球时遇到问题(下图)。 图 1. 一个框架样本,球在水槽中的一些粒子上从右向左移动

由于将帧转换为灰度格式不起作用,我将其转换为 rgb 并使其更加饱和。问题是:1-在第一帧中哪个球在正确的位置,光线干扰了球的检测(图像减法效果不佳) 在此处输入图像描述 所以我没有减法就做了。

这是我在第一帧中检测球的问题。在其余帧中,问题在于它的阴影和球上的白点。我看不到确切的球以在每一帧中找到它的确切位置(它的阴影导致一些不确定性)

无论如何,我正在使用matlab。我分享了下面的代码(由于光线的原因,减法效果不佳,请注意球会移动,因为水会使其在水槽中移动)。

关于如何更准确地检测球的任何想法?处理第一帧中的光线?处理球的影子?

提前致谢。

% 代码开始

I=imread('frame3860.png');
I=imadjust(I,stretchlim(I));
I=lensdistort(I,-0.3);
I2=imcrop(I, [263.5 85.5 1468 940]);
I2=imrotate(I2,-1,'bilinear','crop');
I2=rgb2hsv(I2);
I2(:,:,2)=I2(:,:,2)*1.9;
I3=I2(:,:,1)>0.57 & I2(:,:,1)<0.75;
I4=bwareaopen(I3,200);
I4=medfilt2(I4);
I4=imfill(I4,'holes');
str=strel('disk',1);
I5=imdilate(I4,str);
I5=I5-I4;
e = edge(I5, 'canny');
radii = 30:1:70;
h = circle_hough(e, radii, 'same', 'normalise');
[~,maxIndex] = max(h(:)); %find the global maximum of your accumulator array
[i,j,k] = ind2sub(size(h), maxIndex);
radius = radii(k);
center.x = j;
center.y = i;
N = 200;
theta=linspace(0,2*pi,N);
rho=ones(1,N)*radius;
[X,Y] = pol2cart(theta,rho); 
cent(1,:)=[j,i]; % centroid of the ball in each frame

% 代码完成

如果您对在我的情况下更好的球检测有任何想法,我将不胜感激。

PS 我删除了图片,因为我没有发布超过 2 张图片所需的声誉

提前致谢

1个回答

首先,为了消除阴影,请在将 RGB 图像转换为 HSV 颜色模型之前尝试对其进行规范化。有关这方面的更多信息,请参阅: http ://aishack.in/tutorials/normalized-rgb/

如果球总是在移动,我猜光流将是一个不错的选择。只需计算光流并将流量最高的区域标记为球。

另一种选择是使用跟踪算法,我觉得 MeanShift 在这里是一个不错的选择。但是,跟踪算法要求您在前几帧中精确定位感兴趣的对象。如果对象是固定的(它始终是同一个球),那么跟踪将无法正常工作。