Делаю шаблонное распознавание капчи по этой статье xakep.ru/41033. При сравнение шаблона цифры пять, результата не было. Решил проверить, оказывается шаблон неправильный, хотя всё посчитал вроде правильно, начиная с нуля. Код за меня писать не надо, нужна подсказка. (Полный скрипт ниже)
PHP код:
<?
$data = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSERIXFhQYHzMhHxwcHz8tLyUzSkFOTUlBSEZSXHZkUldvWEZIZoxob3p9hIWET2ORm4+AmnaBhH//2wBDARYXFx8bHzwhITx/VEhUf39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3//wAARCAAQAC0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDoLrU2gv8A7Ii2wYorAzXHl7iSRgDac9P1rRHTmqOowXN3HJbIsHkSptZ3Y7l9SBjB7Y5FWpbeKeLyp40lTj5XUMD+dAD2YIpZiAoGST0AqrYX320z/umjET7Ru6sMAg47delSy2kEtqbZowISNuxflAHtjpVew0/7HPdPudllcFd0rOcBQOcnrnP6UATTahZ28hjnu4InHVXkAP5E1NHIkqK8bq6MMhlOQRUM1tLJIWS9uIh/dRYyB+ak1NGpRFVnZyByzYyfyAFAH//Z";
$data = base64_decode($data);
$im = imagecreatefromstring($data);
imagegif($im, './original.gif');
$width = imagesx($im);
$height = imagesy($im);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
//Цикл перевода капчи в монохромное изображение
for($i=0;$i<$width;$i++) {
for($j=0;$j<$height;$j++) {
// Получаем RGB пикселя по координате
$color=imageColorAt($im,$i,$j);
// Разбиваем RGB на Red,Green,Blue и записываем каждую составляющую в свою переменную
list($r,$g,$b)=array_values(imageColorsForIndex($im,$color));
//Сравнение белого ли цвета пиксель
if(($r>=131 && $r <= 256) && ($g>=131 && $g <= 256) && ($b>=131 && $b <= 256)) {
imagesetpixel($im,$i,$j,$white); // Установка пикселя в белый
}
else {
imagesetpixel($im,$i,$j,$black); // Установка пикселя в чёрный
}
}
}
// Представление картинки в двоичном виде
for($j=0;$j<$height;$j++) {
for($i=0;$i<$width;$i++) {
$color=imageColorAt($im,$i,$j);
list($r,$g,$b)=array_values(imageColorsForIndex($im,$color));
$pixels[$j][$i] = ($r==0 && $g==0 && $b==0) ? 1 : 0; // Замена пикселей на свои обозначения
echo $pixels[$j][$i]; // Вывод бинарной матрицы
}
echo "<br>";
}
// Out
imagegif($im, './mono.gif');
echo "<br>Оригинальное изображение капчи: <img src=original.gif></img><br> Бинарное изображение капчи : <img src=mono.gif></img><br>";
imagedestroy($im);
// Ищем координаты
for($j=0;$j<$height;$j++) { // сначала высота
for($i=0;$i<$width;$i++) { // потом ширина
if($pixels[$j][$i] == 1) {
$pX = $i;
$pY = $j;
$i = $width;
$j = $height;
if(
$pixels[$pX][$pY]==1 &&
$pixels[$pX+4][$pY]==1 &&
$pixels[$pX][$pY+3]==1 &&
$pixels[$pX+4][$pY+4]==1 &&
$pixels[$pX+4][$pY+7]==1 &&
$pixels[$pX][$pY+8]==1
)
{
$symbol_5 = 5;
}
else $symbol_5 = "not recognized.";
}
}
}
echo "--------------------<br>";
echo "pX = $pX<br>pY = $pY<br>";
echo "--------------------<br>";
echo "Result - ".$symbol_5;
echo "<br>--------------------<br>";
// Проверка шаблона
echo $pixels[$pX][$pY]."<br>"; /* $pixels[$pX+1][$pY+1] Будет 1 */
echo $pixels[$pX+4][$pY]."<br>"; // 1
echo $pixels[$pX][$pY+3]."<br>"; /* $pixels[$pX][$pY+3] Будет 1 */
echo $pixels[$pX+4][$pY+4]."<br>"; // Тут должна быть 1
echo $pixels[$pX+4][$pY+7]."<br>"; // Тут должна быть 1
echo $pixels[$pX][$pY+8]; // Тут должна быть 1
echo "<br>--------------------";
?>
Для распознавания цифры 5 идёт шаблон. (Кусок кода ниже)
PHP код:
if(
$pixels[$pX][$pY]==1 &&
$pixels[$pX+4][$pY]==1 &&
$pixels[$pX][$pY+3]==1 &&
$pixels[$pX+4][$pY+4]==1 &&
$pixels[$pX+4][$pY+7]==1 &&
$pixels[$pX][$pY+8]==1
)
{
$symbol_5 = 5;
}
else $symbol_5 = "not recognized.";
Там проверяются координаты в бинарной матрице изображения. Если в указанных координатах существуют единицы то цифра определена.
Для составления шаблона, вывел матрицу на экран и посчитал все нужные мне координаты и записал в код для проверки шаблона. Проблема заключается в не определении координат. То есть координаты я посчитал, но при выполнении скрипта выдаёт в тех координатах, которые я посчитал, нули.