[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выделить некоторую область из изображения
Shtefanka
Здравствуйте!
Я хочу выделить в изображении область и распознать номер телефона, для этого мне нужно поступающее изображение поделить на 2 части по высоте и распознать номер телефона в первой части, а потом во второй. Обратите внимание на функцию imageToMatrix, собственно говоря, там я и пытаюсь это реализовать(пока только с первой частью), но у меня возникает ошибка: Notice: Undefined variable: im, в этой строке: $this->$im = @imagecreatefromjpeg($path);
Если я убираю обрезку изображения, то все отлично. Я так понимаю, проблема в том, что свою область я называю новым именем и строю бинарную матрицу по нему, но ведь в конструкторе то мы вызываем поступающее изображение?
Может есть другой вариант выделение области на изображении?
Вот код:
<?php

//Устанавливаем сообщения об ошибках
ini_set("display_errors", "1");
error_reporting(E_ALL);

// пробуем распознать картинку 1.png
$encrypt = new crackCapcha('img/2.jpg');
echo "<br><span style='font-size: 25px;'>Resolve: ".$encrypt->resolve."</span><br><br>";

class crackCapcha {

public $im;
public $binaryMartix;
public $assocNumber = array(
'200' => 0,
'77' => 1,
'156' => 2,
'180' => 3,
'147' => 4,
'184' => 5,
'213' => 6,
'118' => 7,
'215' => 8,
'209' => 9,
);


public $resolve;


function __construct($path) {
$this->$im = @imagecreatefromjpeg($path);

if (!$this->$im){
return false;
}

$this->binaryMartix = $this->imageToMatrix($this->$im, true);
$explode = $this->explodeMatrix($this->binaryMartix);
$this->resolve = '';
foreach ($explode as $number) {
$this->resolve .= $this->assocNumber[$number];
}
}



function explodeMatrix($binaryMartix) {
$temp = array();

// сложение столбцов для выявления интервалов
for ($i = 0; $i < count($binaryMartix); $i++) {
$sum = 0;
for ($j = 0; $j < count($binaryMartix[0]); $j++) {
$sum += $binaryMartix[$i][$j];
}
$temp[] = $sum ? 1 : 0;
echo $sum;
}

// вычисление интервалов по полученной строке
$start = false;
$countPart = 0;
$arrayInterval = array();
foreach ($temp as $k => $v) {

if ($v == 1 && !$start) {
$arrayInterval[$countPart]['start'] = $k;
$start = true;
//echo $k;
}

if ($v == 0 && $start) {
$arrayInterval[$countPart]['end'] = $k - 12;
$start = false;
$countPart++;
}
}


// сложение всех единиц в полученных интервалах столбцов
foreach ($arrayInterval as $interval) {
$sum = 0;
for ($i = 0; $i < count($binaryMartix); $i++) {
for ($j = 0; $j < count($binaryMartix[0]); $j++) {
if ($i >= $interval['start'] && $i <= $interval['end']) {
$sum += $binaryMartix[$i][$j];
}
}
}

$result[] = $sum;
}

return $result;
}

/**
* Конвертация рисунка в бинарную матрицу
* Все пиксели отличные от фона получают значение 1
*
@param imagecreatefrompng $im - картинка в формате PNG
*
@param bool $rotate - горизонтальная или вертикальная матрица
*/

function imageToMatrix($im, $rotate = false) {

list($w, $h, $type, $attr) = getimagesize($im);
//$src_im = imagecreatefromjpeg($im);

$src_x = '0'; // начальная позиция x
$src_y = '0'; // начальная позиция y
$width = $w; // ширина
$height = $h/2; // высота
$dst_x = '0'; // координата результирующего изображения x
$dst_y = '0'; // координата результирующего изображения y
$dst_im = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($dst_im, 255, 255, 255);
imagefill($dst_im, 0, 0, $white);
imagecopy($dst_im, $im, $dst_x, $dst_y, $src_x, $src_y, $width, $heigh);



$height = imagesy($dst_im);
$width = imagesx($dst_im);


if ($rotate) {
$height = imagesx($dst_im);
$width = imagesy($dst_im);
}


$background = 0;
for ($i = 0; $i < $height; $i++)
for ($j = 0; $j < $width; $j++) {


if ($rotate) {
$rgb = imagecolorat($dst_im, $i, $j);
} else {
$rgb = imagecolorat($dst_im, $j, $i);
}

//получаем индексы цвета RGB
list($r, $g, $b) = array_values(imageColorsForIndex($dst_im, $rgb));

//вычисляем индекс красного, для фона изображения
if ($i == 0 && $j == 0) {
$background = $r;
}

// если цвет пикселя не равен фоновому заполняем матрицу единицей
$binary[$i][$j] = ($r == $background) ? 0 : 1;
}

return $binary;
}

/**
* Выводит матрицу на экран
*
@param type $binaryMartix
*/

function printMatrix($binaryMartix) {
for ($i = 0; $i < count($binaryMartix); $i++) {
echo "<br/>";
for ($j = 0; $j < count($binaryMartix[0]); $j++) {
echo $binaryMartix[$i][$j]." ";
}
}
}

}


?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.