如何将图像转换为另一个坐标?

How to transform an image to another coordinates?

我试图在我的数据库中找到重复的视频,为了做到这一点,我从一对视频中抓取两个帧,将它们调整为相同的宽度和高度,然后逐个像素地比较两个图像。

我有一个案例,视频对中的图像如下所示:

-----

这些实际上是相同的视频(图像),但由于视频的纵横比(16:9,4:3 ..等)逐像素比较时结果为负(不匹配).

如果我的标准是 50x50,我如何将 any 感兴趣区域转换为 50x50?

对于上面的例子:

Pixel [5,0] shall be [0,0]

Pixel [45,0] shall be [50,0]

Pixel [5,50] shall be [0,50]

Pixel [45,50] shall be [50,50]

and all other pixels are transformed

OP 鼓励伪代码会有所帮助....
我不了解"emgucv",所以我会用伪代码回答。

定义

SRC 为源图像 - 待读。
DST 成为目标图像 - 将被写入。

SRCDST都是二维数组,可以用ARRAY[int pixelX,int pixelY].

来访问

这是伪代码:-

input : int srcMinX,srcMinY,srcMaxX,srcMaxY;
float linearGra(float dst1,float dst2,float src1,float src2,float dst3){
    return ( (dst3-dst1)*src2+  (dst2-dst3)*src1) / (dst2-dst1);
};
for(int y=0;y<50;y++){     //y of DST
    for(int x=0;x<50;x++){ //x of DST
        float xSRC=linearGra(0,50,srcMinX,srcMaxX,x);
        float ySRC=linearGra(0,50,srcMinY,srcMaxY,y);
        DST[x,y]=SRC[round(xSRC),round(ySRC)];  //find nearest pixel
    }
}

描述

大意是利用linear-interpolation

函数 linearGra 在二维图中取两个点 (dst1,src1)(dst2,src2)

假设是线性函数(因为scaling+movingSRCDST坐标之间的线性函数),就会找到点(dst3,?)躺在图中。

我使用此函数计算 SRC 中与 DST 中某个像素匹配的像素坐标。

进一步工作

如果你是一个完美主义者,你可能想要:-

  • 限制索引(xSRC,ySRC) - 所以它不会索引越界
  • 提高准确性:-
    我目前忽略了一些像素(我使用最近邻 w/o 插值)。
    更好的方法是 integrate all involved SRC's pixel,但在某些情况下你会得到有点模糊的图像。

您可能还对this opencv link (not emgucv)感兴趣。