两个图像之间的像素坐标

时间:2016-02-05 14:19:41

标签: c++ qt pixel

我正在寻找一种能够轻松计算两幅图像的像素坐标的解决方案。

问题:如果您使用以下代码,我如何计算从" QVector差异"更改的像素坐标? ?是否可以使用(x,y)坐标并在currentImage上找到它代表的像素?

char *previousImage;
char *currentImage;
QVector difference<LONG>;

for(int i = 0 ; i < CurrentImageSize; i++)
{
    //Check if pixels are the same (we can also do it with RGB values, this is just for the example)
    if(previousImagePixel != currentImagePixel)
    {
        difference.push_back(currentImage - previousImage);
    }
    currentImage++;
}

修改 有关此主题的更多信息:

  • 图像为RGB格式
  • 两个图像的宽度,高度和bpp都是已知的
  • 我有一个指向代表图像的字节的指针

这里的主要目标是清楚地知道在两个图像之间发生变化的像素的新值是什么,并知道它是哪个像素(它的坐标)

2 个答案:

答案 0 :(得分:1)

没有足够的信息可以回答,但我会尝试给你一些想法。

你已声明char *previousImage;,这对我来说意味着你有一个指向代表图像的字节的指针。你需要的不仅仅是解释图像。

  1. 您需要知道像素格式。你提到RGB,所以 - 暂时,让我们假设图像为每个像素使用3个字节,顺序为RGB
  2. 您需要知道图像的宽度。
  3. 鉴于上述2,您可以计算&#34; Row Stride&#34;,这是一行占用的字节数。这通常是每个像素的&#34;字节&#34; *&#34;图像宽度&#34;,但它通常被填充为可被4整除。所以3 bpp和15的宽度将是45字节+ 3字节的填充以使行跨步48。
  4. 鉴于此,如果您有图像数据的索引,则首先将其除以行步长进行整数除以得到行(Y坐标)。
  5. X坐标是(行距离的索引mod)整数除以每个像素的字节数。

答案 1 :(得分:1)

根据我的理解,您需要计算两个图像之间发生的位移或运动。例如。对于I(x, y, t=previous)中的每个像素previousImage,您想知道它在currentImage中的位置,以及他的新坐标I(x, y, t=current)

如果是这种情况,那么它会调用motion estimation并测量optical flow。根据您在图像序列中观察到的对象,有许多算法依赖于或多或少复杂的假设。

最简单的假设是,如果您在观察的场景中跟随移动像素I(x, y, t),其亮度将随时间保持不变。换句话说,dI(x,y,t) / dt = 0

由于I(x, y, t)是具有两个未知数的三个参数(空间和时间)的函数,并且只有一个方程,这是一个定义不明确的问题,没有简单的解决方案。许多算法都增加了一个额外的假设,因此可以通过一个独特的解决方案解决问题。

你可以使用现有的库来为你做这件事,其中一个非常受欢迎的是openCV