Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Распознать наличие рукописной "галочки" в определенном квадрате (http://www.flasher.ru/forum/showthread.php?t=187925)

scarbo 26.11.2012 15:06

Распознать наличие рукописной "галочки" в определенном квадрате
 
Добрый день. Есть такая задача - нужно распознать наличие рукописной "галочки" в определенном квадрате.
Как видно на представленных ниже скриншотах, есть 10 квадратов в которых могут находиться "галочки".
Как можно найти в каком из квадратов они есть?
Абсолютная точность не нужна.
Как мне кажется, нужно разбить данную BitmapData на сектора, выбрать пиксели в каждом секторе и найти, есть ли в нем пиксели с RGB отличной от бело-серого фона-шума.
Собственно вопрос, в какую сторону копать, чтобы алгоритм был довольно шустр и как отделить бело-серый шум?
---
http://scarbo.ru/photo/0.jpg
---
http://scarbo.ru/photo/1.jpg
---
http://scarbo.ru/photo/2.jpg

Aquahawk 26.11.2012 15:17

вам надо посчитать средний цвет картинки. Потом его вычесть из каждого пикселя и посчитать сколько пикселей с отклонением больше определённого порога в квадрате

scarbo 26.11.2012 15:29

Что-то вроде этого?
Код AS3:

var b:BitmapData = new BitmapData(); //тут наша картинка
var v:Vector.<uint> = b.getVector(new Rectangle(0, 0, 100, 100));//получаем список пикселей из 1 квадрата
var avg:uint = this._getSumm(v) / v.length; // получаем средний цвет (складываем все цвета и делим на общее кол-во цветов), наверное это будет затратно по ресурсам
var length:uint = v.length;
for(var i:uint = 0; i < length; i++){
var color:uint = v[i];
color - avg
//а что дальше?
}

Может стоит посмотреть в сторону getColorBoundsRect?
Только как указать правильно значение цвета если фон там не чисто белый.

silin 26.11.2012 16:30

такой вариант:
Код AS3:

// картинка
var bmp:Bitmap = new embedImage() as Bitmap;
//addChild(bmp);
var bmd:BitmapData = bmp.bitmapData;
 
// клетка
var rec:Rectangle = new Rectangle(166, 1, 48, 32);
//var rec:Rectangle = new Rectangle(118, 1, 48, 32);
 
// битмап цвета фона
var bmd1:BitmapData = new BitmapData(rec.width, rec.height, false, 0xFFFFFF);
// рисуем в него клетку с BlendMode.DIFFERENCE
var mtrx:Matrix = new Matrix();
mtrx.translate(-rec.x, -rec.y);
bmd1.draw(bmd, mtrx, null, BlendMode.DIFFERENCE);
 
// смотрим по синему каналу с какой-то точностью есть ли что-то
var tol:int = 32;
var num:int = bmd1.threshold(bmd1, bmd1.rect, new Point(), ">", tol, 0, 0xFF);
trace( "num : " + num );


scarbo 26.11.2012 16:39

Спасибо, с попробовал сделать по среднему цвету, на примере этого - http://www.flasher.ru/forum/archive/.../t-123478.html
Сейчас тестирую, пока точность попадания 100%


Часовой пояс GMT +4, время: 11:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.