c# - 验证图像序列

标签 c# image-processing computer-vision

问题

问题塑造

图像序列位置大小 是固定的并且事先已知(未缩放)。它将非常短,最多 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]

alt text alt text alt text
事实证明,使用 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 对图像进行灰度化

源代码示例

来源示例(GUIcode):

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

        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. 并非所有图像序列 [视频] 都相同 [但很多相似]
  2. 您的数据来自哪里?
  3. 您将如何表示与您的观看次数相关的数据?
  4. 数据大小

问题 #1:

许多图像可能因压缩、水印、缺失帧和添加剪辑而略有不同。我建议对视频进行采样。例如,您可能需要考虑对视频中的一小部分图像进行子采样。此外,为了避免嘈杂的图像和有损压缩算法的问题。您可能需要考虑对采样的帧进行灰度化,并进行高斯模糊。 [Guassian 因为它“更自然”(简短回答)] 一旦你有足够的子样本到你有信心与视频相似的地方,然后将它存储在数据库中。使用样本,您可以对它们进行哈希处理,或存储它们以便稍后进行相似度百分比计算。

问题#2

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

问题 #3

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

问题#4

数据的大小对召回、抽样、查询数据库等都有很大的决定作用

总体建议:在此阶段,不要贪多嚼不烂。从小处着手,然后成长。

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

关于c# - 验证图像序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983508/

相关文章:

c# - 对于需要精确到 .00001 的翻译,Decimal 或 Double 会更好吗?

c# - 仅对 DbContext 中的一个查询使用选项 IsolationLevel.ReadUncommited

c++ - 过滤器组的 Opencv getGaborKernel 参数

computer-vision - 对象识别 vs 检测 vs 分类?有什么不同?

c# - 如何动态地向匿名对象添加属性?

c++ - 如何检测opencv中所有具有相同颜色值的相邻像素

performance - 在 Matlab 中不使用 for 循环操作矩阵

Java MS Word 和 PDF 转换为图像 (png/jpg)

java - 使用两个相机进行立体校准和物体的 3D 重建?

c# - 如何在 Crystal 报表中显示两个单独的列表?