Проблема
Определение проблемы
Последовательность изображений позиция и размер фиксированы и известны заранее (это не масштабируется). Он будет довольно коротким, максимум 20 кадров и в замкнутом цикле. Я хочу проверить (событие, вызванное нажатием кнопки), которое я видел раньше.
Скажем, у меня есть последовательность изображений, например:
http://img514.imageshack.us/img514/5440/60372aeba8595eda.gif
Если увиден, я хочу увидеть связанный с ним идентификатор, если нет - он будет проанализирован и добавлен как новый экземпляр последовательности изображений, который был замечен. У меня есть об этом довольно долгое время, и я признаю, что это может быть трудной проблемой. Кажется, мне сложно с этим справиться, может ли кто-нибудь помочь (на С#)?
Ограничения и использование
Я не, пытаюсь воссоздать систему обнаружения авторских прав, например, систему идентификаторов контента, реализованную Youtube (Маргарет Гулд Стюарт в TED (ссылка)). Последовательность изображений можно рассматривать как файл (.gif), но это не так, и нет прямого способа получить двоичный файл. Подобный метод можно использовать, чтобы избежать дублирования в "базе данных обмена изображениями", но это не то, что я пытаюсь сделать.
Мое усилие
Размытие по Гауссу
Функция Mathematica для генерации гауссовских размытых ядер:
getKernel[L_] := Transpose[{L}].{L}/(Total[Total[Transpose[{L}].{L}]])
getVKernel[L_] := L/Total[L]
Оказывается, что гораздо эффективнее использовать 2 прохода векторного ядра, а затем матричное ядро. Thy основаны на Треугольник Паскаля неровные строки:
{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 для получения хэша md5 содержимого внутри известного прямоугольника atm.
- Использование 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;
}