如何将图像转换为另一个坐标?
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
成为目标图像 - 将被写入。
SRC
和DST
都是二维数组,可以用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+moving
是SRC
和DST
坐标之间的线性函数),就会找到点(dst3,?)
躺在图中。
我使用此函数计算 SRC
中与 DST
中某个像素匹配的像素坐标。
进一步工作
如果你是一个完美主义者,你可能想要:-
- 限制索引
(xSRC,ySRC)
- 所以它不会索引越界
- 提高准确性:-
我目前忽略了一些像素(我使用最近邻 w/o 插值)。
更好的方法是 integrate all involved SRC
's pixel,但在某些情况下你会得到有点模糊的图像。
您可能还对this opencv link (not emgucv)感兴趣。
我试图在我的数据库中找到重复的视频,为了做到这一点,我从一对视频中抓取两个帧,将它们调整为相同的宽度和高度,然后逐个像素地比较两个图像。
我有一个案例,视频对中的图像如下所示:
这些实际上是相同的视频(图像),但由于视频的纵横比(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
成为目标图像 - 将被写入。
SRC
和DST
都是二维数组,可以用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+moving
是SRC
和DST
坐标之间的线性函数),就会找到点(dst3,?)
躺在图中。
我使用此函数计算 SRC
中与 DST
中某个像素匹配的像素坐标。
进一步工作
如果你是一个完美主义者,你可能想要:-
- 限制索引
(xSRC,ySRC)
- 所以它不会索引越界 - 提高准确性:-
我目前忽略了一些像素(我使用最近邻 w/o 插值)。
更好的方法是 integrate all involvedSRC
's pixel,但在某些情况下你会得到有点模糊的图像。
您可能还对this opencv link (not emgucv)感兴趣。