我试图在我的数据库中找到重复的视频,为了做到这一点,我从视频对中抓取两个帧,将它们调整为相同的宽度和高度,然后逐个像素地比较两个图像。
我有一个案例,来自视频对的图片如下所示:
这些实际上是相同的视频(图像),但由于视频的宽高比(16:9,4:3等),在逐个像素(不匹配)比较时结果为负。
如果我的标准是50x50,我如何将 任何 感兴趣区域转换为50x50?
对于上面的例子:
像素[5,0]应为[0,0]
像素[45,0]应为[50,0]
像素[5,50]应为[0,50]
像素[45,50]应为[50,50]
所有其他像素已转换
答案 0 :(得分:1)
鼓励OP伪代码可以提供帮助.... 我不知道" emgucv",所以我会用伪代码回答。
让SRC
成为源图像 - 待阅读
让DST
成为目标图像 - 写入。
SRC
和DST
都是2D数组,可以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
在2D图(dst1,src1)
和(dst2,src2)
中占两个点。
假设它是一个线性函数(因为scaling+moving
是SRC
和DST
坐标之间的线性函数,这是真的),它会找到谎言的(dst3,?)
点在图中。
我使用此函数计算SRC
中与DST
中某个像素匹配的像素坐标。
如果你是一个完美主义者,你可能想: -
(xSRC,ySRC)
- 所以它不会索引越界SRC
's pixel,但在某些情况下你会得到一个模糊的图像。您可能也对this opencv link (not emgucv)感兴趣。