验证图像序列

Mar*_*gus 5 c# image-processing computer-vision

问题

问题塑造

图像序列的位置大小是固定的并且事先已知(它没有缩放).它将非常短,最多20帧并且处于闭环状态.我想验证(由按钮点击驱动的事件),我以前见过它.

可以说我有一些图像序列,如:

http://img514.imageshack.us/img514/5440/60372aeba8595eda.gif

如果看到,我想看到与之关联的ID,如果没有 - 它将被分析并添加为已经看到的图像序列的新实例.我有很长一段时间,但我承认,这可能是一个难题.我似乎很难将这些全部放在一起,有人可以协助(在C#中)吗?

限制和用途

我并没有尝试重新创建版权检测系统,就像Youtube实施的内容ID系统一样(Margaret Gould Stewart在TED(链接)).图像序列可以像(.gif)文件一样被考虑,但它不是,并且没有直接的方法来获取二进制文件.可以使用类似的方法,以避免"图像共享数据库"中的重复,但它不是我想要做的.

我的努力

高斯模糊

Mathematica函数生成高斯模糊内核:

getKernel[L_] := Transpose[{L}].{L}/(Total[Total[Transpose[{L}].{L}]])
getVKernel[L_] := L/Total[L]
Run Code Online (Sandbox Code Playgroud)

替代文字替代文字替代文字
事实证明,使用2遍向量内核,然后使用矩阵内核更有效.你的基于Pascal三角形不均匀的行:

{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}
Run Code Online (Sandbox Code Playgroud)

数据输入,散列,灰度和灯箱

源位的示例,可能有用:

  • 已知矩形周围的灯箱:FrameX
  • 使用MD5CryptoServiceProvider获取已知矩形atm内的内容的md5哈希值.
  • 使用ColorMatrix灰度图像

来源示例

源示例(GUI ; 代码):

获取定义矩形内的当前内容.

        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;
        }
Run Code Online (Sandbox Code Playgroud)

获取位图的md5哈希值.

        private byte[] getBitmapHash(Bitmap hc) {
            return md5.ComputeHash(c.ConvertTo(hc, typeof(byte[])) as byte[]);
        }
Run Code Online (Sandbox Code Playgroud)

获取图像的灰度.

        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;
        }
Run Code Online (Sandbox Code Playgroud)

mon*_*ksy 3

我认为您对此有几个问题:

  1. 并非所有图像序列[视频]都是相同的[但许多是相似的]
  2. 你的数据来自哪里?
  3. 您将如何表述与您的观看次数相关的数据?
  4. 数据大小

问题#1:

许多图像可能因压缩、水印、丢失帧和添加剪辑而略有不同。我建议对视频进行采样。例如,您可能需要考虑对视频中图像的一小部分进行二次采样。此外,为了避免噪声图像和有损压缩算法的问题。您可能需要考虑对采样的帧进行灰度化,并进行高斯模糊。[高斯,因为它“更自然”(简短的回答)]一旦你有足够的子样本,你对视频的相似性有很好的信心,然后将其存储在数据库中。使用样本,您可以对它们进行散列,或者存储它们以便稍后进行%相似度。

问题 #2

您的数据源将影响您使用的工具包和库。我建议保持这个简单[用 gif 保存并创建自定义查看器,不要在开发逻辑时尝试编写浏览器插件]

问题 #3

强烈建议使用 Postgres [如果有很多大型对象] 或 SQLLite 来索引、存储和调用过去的元数据。

问题 #4

数据的大小将对召回、采样、查询数据库等产生巨大的决定。

总体建议:现阶段不要咬下超出你能承受的范围。从小处开始,然后逐渐成长。

另请参阅计算机视觉算法,以获取有关对象表示/召回的更多帮助。