我试图使用关联来跟踪一个对象。我在一个更大的图像中找到一个更小的补丁,一帧一帧。为此,我将在修补程序中找到移位,在相关性最大的地方,使用新的补丁更新修补程序。
我的代码是:
cv::Mat im_float_2,imagePart_out;
cv::Mat im_floatBig;
cv::Scalar im1_Mean, im1_Std, im2_Mean, im2_Std;
double covar, correl;
int n_pixels;
void computeShift()
{
int maxRow=0, maxCol=0, TX, TY;
double GMAX=0;
Mat image_window = Mat::zeros(imagePart.rows, imagePart.cols, CV_32F);
imagePart.convertTo(im_float_2, CV_32F);
imageBig.convertTo(im_floatBig,CV_32F);
for(maxRow=0; maxRow<=imageBig.rows-image_window.rows;maxRow++)
{
for(maxCol=0; maxCol<imageBig.cols-image_window.cols;maxCol++)
{
image_window = im_floatBig( cv::Rect( maxCol, maxRow,
image_window.cols, image_window.rows ) );
n_pixels = image_window.rows * image_window.cols;
// Compute mean and standard deviation of both images
meanStdDev(image_window, im1_Mean, im1_Std);
meanStdDev(im_float_2, im2_Mean, im2_Std);
// Compute covariance and correlation coefficient
covar = (image_window - im1_Mean).dot(im_float_2 - im2_Mean) / n_pixels;
correl = covar / (im1_Std[0] * im2_Std[0]);
if (correl > GMAX)
{
GMAX = correl; TX = maxRow; TY=maxCol;
image_window.convertTo(imagePart, CV_8UC1);
}
}
}
cvtColor(imagePart, imagePart_out, CV_GRAY2BGR);
printf("\nComputed shift: [%d, %d] MAX: %f\n", TX, TY,GMAX);
}但是在执行时,我的FPS(1-2)非常低,甚至对于小视频大小(帧大小-262x240,补丁大小- 25x25)也是如此。
有没有办法达到更高的FPS。我也在看相位相关的方向,但不知道如何从这里开始。把它转换成频域会有帮助吗?
现在,我想优化以上代码的速度。
发布于 2018-10-11 07:07:35
是的,你很可能会从使用FFT中获益。只需将im_float_2设置为im_floatBig大小即可。在傅里叶域内,在其中一个变换的复共轭后,相乘导致互相关,这与你的correl值不一样(不除以发生的标准差)。但我不认为你真的需要标准化的标准偏差得到一个良好的模板匹配。互相关本身工作得很好。结果中最大值的位置可以转换为模板w.r.t的位移。图像。
通过FFT实现互相关的步骤如下:
此像素的位置指示填充模板w.r.t的转换。另一幅图像。如果它们最佳匹配而不进行平移,则最大像素将位于(x,y)=(0,0)。如果它在(1,0),它表示沿着x移动一个像素。方向取决于你计算出的复共轭的两个中的哪一个。注意,这个结果是周期性的,相反方向上的一个像素移动是由图像右侧的最大像素表示的。简单地进行一些实验,以确定如何将位置转换为模板的移位。
关于您的代码:
meanStdDev(im_float_2, im2_Mean, im2_Std);是在循环中计算的,即使im_float_2没有变化。n_pixels的除法也是如此。image_window.convertTo(imagePart, CV_8UC1)移出循环。很可能在最终找到实际的最大值之前,您会多次更新当前的最大值。如果只使用最后一个窗口,那么将这么多子窗口转换为CV_U8是没有意义的。在循环中,您将更新max的(x,y)坐标。只投最后位置。https://stackoverflow.com/questions/52753902
复制相似问题