问题
问题塑造
图像序列位置 和大小 是固定的并且事先已知(未缩放)。它将非常短,最多 20 帧并且处于闭环中。我想验证(由按钮点击驱动的事件),我以前见过它。
假设我有一些图像序列,例如:
http://img514.imageshack.us/img514/5440/60372aeba8595eda.gif
如果看到,我想查看与其相关联的 ID,如果没有 - 它将被分析并添加为已看到的图像序列的新实例。我已经考虑了很长时间,我承认,这可能是一个难题。我似乎很难将所有这些放在一起,有人可以提供帮助(在 C# 中)吗?
限制和使用
我不是试图重新创建版权检测系统,例如 Youtube 已经实现的内容 ID 系统(玛格丽特古尔德斯图尔特在 TED ( link ))。可以将图像序列视为 (.gif) 文件,但它不是,也没有直接获取二进制文件的方法。可以使用类似的方法,以避免在“图像共享数据库”中出现重复,但这不是我想要做的。
我的努力
高斯模糊
生成高斯模糊核的 Mathematica 函数:
getKernel[L_] := Transpose[{L}].{L}/(Total[Total[Transpose[{L}].{L}]])
getVKernel[L_] := L/Total[L]
事实证明,使用 2 遍向量核,然后是矩阵核,效率要高得多。你是基于 Pascal triangle不均匀的行:
{1d/4, 1d/2, 1d/4}
{1d/16, 1d/4, 3d/8, 1d/4, 1d/16}
{1d/64, 3d/32, 15d/64, 5d/16, 15d/64, 3d/32, 1d/64}
数据输入、散列、灰度和灯箱
可能有用的源位示例:
- 围绕已知矩形的灯箱:FrameX
- 使用 MD5CryptoServiceProvider 获取已知矩形 atm 中内容的 md5 哈希值。
- 使用 ColorMatrix 对图像进行灰度化
源代码示例
获取定义矩形内的当前内容。
private Bitmap getContentBitmap() {
Rectangle r = f.r;
Bitmap hc = new Bitmap(r.Width, r.Height);
using (Graphics gf = Graphics.FromImage(hc)) {
gf.CopyFromScreen(r.Left, r.Top, 0, 0, //
new Size(r.Width, r.Height), CopyPixelOperation.SourceCopy);
}
return hc;
}
获取位图的 md5 哈希。
private byte[] getBitmapHash(Bitmap hc) {
return md5.ComputeHash(c.ConvertTo(hc, typeof(byte[])) as byte[]);
}
获取图像的灰度。
public static Bitmap getGrayscale(Bitmap hc){
Bitmap result = new Bitmap(hc.Width, hc.Height);
ColorMatrix colorMatrix = new ColorMatrix(new float[][]{
new float[]{0.5f,0.5f,0.5f,0,0}, new float[]{0.5f,0.5f,0.5f,0,0},
new float[]{0.5f,0.5f,0.5f,0,0}, new float[]{0,0,0,1,0,0},
new float[]{0,0,0,0,1,0}, new float[]{0,0,0,0,0,1}});
using (Graphics g = Graphics.FromImage(result)) {
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(colorMatrix);
g.DrawImage(hc, new Rectangle(0, 0, hc.Width, hc.Height),
0, 0, hc.Width, hc.Height, GraphicsUnit.Pixel, attributes);
}
return result;
}
最佳答案
我认为您对此有一些疑问:
- 并非所有图像序列 [视频] 都相同 [但很多相似]
- 您的数据来自哪里?
- 您将如何表示与您的观看次数相关的数据?
- 数据大小
问题 #1:
许多图像可能因压缩、水印、缺失帧和添加剪辑而略有不同。我建议对视频进行采样。例如,您可能需要考虑对视频中的一小部分图像进行子采样。此外,为了避免嘈杂的图像和有损压缩算法的问题。您可能需要考虑对采样的帧进行灰度化,并进行高斯模糊。 [Guassian 因为它“更自然”(简短回答)] 一旦你有足够的子样本到你有信心与视频相似的地方,然后将它存储在数据库中。使用样本,您可以对它们进行哈希处理,或存储它们以便稍后进行相似度百分比计算。
问题#2
您的数据源将影响您使用的工具包和库。 我建议保持这个简单[保持它与 gifs 并创建一个自定义查看器,不要在开发逻辑时尝试编写浏览器插件]
问题 #3
强烈建议使用 Postgres [如果有很多大型对象] 或 SQLLite 之类的东西来索引、存储和调用过去的元数据。
问题#4
数据的大小对召回、抽样、查询数据库等都有很大的决定作用
总体建议:在此阶段,不要贪多嚼不烂。从小处着手,然后成长。
另请参阅计算机视觉算法以获得有关对象表示/召回的更多帮助。
关于c# - 验证图像序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983508/