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