两个图像之间的像素坐标
Coordinates of a pixel between two images
我正在寻找一种解决方案来轻松计算两个图像的像素坐标。
问题: 如果采用以下代码,我如何计算从 "QVector difference" 改变的像素坐标?是否可以有一个 (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都是已知的
- 我有一个指向表示图像的字节的指针
这里的主要objective是为了清楚知道两幅图像之间发生变化的像素的新值是多少,并知道它是哪个像素(它的坐标)
没有足够的信息来回答,但我会尽量给你一些想法。
您已声明 char *previousImage;
,这对我来说意味着您有一个指向表示图像的字节的指针。您需要的不仅仅是这些来解读图像。
- 您需要了解像素格式。你提到了 RGB,所以——暂时,我们假设图像每个像素使用 3 个字节,顺序是 RGB
- 您需要知道图片的宽度。
- 鉴于以上2,可以计算出"Row Stride",也就是一行占用的字节数。这通常是 "bytes per pixel" * "image width",但它通常被填充以被 4 整除。所以 3 bpp 和宽度 15,将是 45 字节 + 3 字节的填充来制作行步幅 48.
- 鉴于此,如果您有图像数据的索引,您首先将它除以行跨度以获得行(Y 坐标)。
- X 坐标是(索引 mod 行跨度)整数除以每个像素的字节数。
据我了解,您想计算两个图像之间发生的位移或运动。例如。对于 previousImage
中的每个像素 I(x, y, t=previous)
,您想知道它在 currentImage
中的位置以及他的新坐标是什么 I(x, y, t=current)
.
如果是这样,那就叫motion estimation and measuring the optical flow。有很多算法,它们依赖于或多或少复杂的假设,具体取决于您在图像序列中观察到的对象。
最简单的假设是,如果你在你观察的场景中跟随一个移动像素I(x, y, t)
,它的亮度会随着时间的推移保持不变。换句话说,dI(x,y,t) / dt = 0
.
由于 I(x, y, t)
是三个参数(space 和时间)和两个未知数的函数,并且只有一个方程,这是一个定义不清的问题,没有简单的解决方案。很多算法都加了一个额外的假设,这样就可以用唯一解来解决问题。
您可以使用现有的库来为您做到这一点,其中一个非常受欢迎的库是 openCV。
我正在寻找一种解决方案来轻松计算两个图像的像素坐标。
问题: 如果采用以下代码,我如何计算从 "QVector difference" 改变的像素坐标?是否可以有一个 (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都是已知的
- 我有一个指向表示图像的字节的指针
这里的主要objective是为了清楚知道两幅图像之间发生变化的像素的新值是多少,并知道它是哪个像素(它的坐标)
没有足够的信息来回答,但我会尽量给你一些想法。
您已声明 char *previousImage;
,这对我来说意味着您有一个指向表示图像的字节的指针。您需要的不仅仅是这些来解读图像。
- 您需要了解像素格式。你提到了 RGB,所以——暂时,我们假设图像每个像素使用 3 个字节,顺序是 RGB
- 您需要知道图片的宽度。
- 鉴于以上2,可以计算出"Row Stride",也就是一行占用的字节数。这通常是 "bytes per pixel" * "image width",但它通常被填充以被 4 整除。所以 3 bpp 和宽度 15,将是 45 字节 + 3 字节的填充来制作行步幅 48.
- 鉴于此,如果您有图像数据的索引,您首先将它除以行跨度以获得行(Y 坐标)。
- X 坐标是(索引 mod 行跨度)整数除以每个像素的字节数。
据我了解,您想计算两个图像之间发生的位移或运动。例如。对于 previousImage
中的每个像素 I(x, y, t=previous)
,您想知道它在 currentImage
中的位置以及他的新坐标是什么 I(x, y, t=current)
.
如果是这样,那就叫motion estimation and measuring the optical flow。有很多算法,它们依赖于或多或少复杂的假设,具体取决于您在图像序列中观察到的对象。
最简单的假设是,如果你在你观察的场景中跟随一个移动像素I(x, y, t)
,它的亮度会随着时间的推移保持不变。换句话说,dI(x,y,t) / dt = 0
.
由于 I(x, y, t)
是三个参数(space 和时间)和两个未知数的函数,并且只有一个方程,这是一个定义不清的问题,没有简单的解决方案。很多算法都加了一个额外的假设,这样就可以用唯一解来解决问题。
您可以使用现有的库来为您做到这一点,其中一个非常受欢迎的库是 openCV。