Сравнение картинок

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сравнение картинок

Сообщение Jenizix » 12.08.2005 (Пт) 12:28

Вощем есть картинки типа такой: http://jenizix.net.ru/tmp/1.bmp
есть еще вот такие картинки с цифрами: http://jenizix.net.ru/tmp/0.bmp 10 штук с цифрами от 0 до 9

Известно: координата левого края первой цифры - 10, все цифры шириной 5, между 1 и 2 цифрой интервал - 2, между 2,3,4,5 интервал - 3, между 5 и 6 интервал - 2, и дальше опять между следующими интервал 3, но положение по вертикали у цифр разное на разных картинках!

Вопрос: как можно определить хотябы сходство 1 цифры на картинке1 с цифрой на картинке2

Хм... думаю понятно написал... вощем даже вот так можно:
есть картинка: http://jenizix.net.ru/tmp/2.bmp и есть картинка: http://jenizix.net.ru/tmp/0.bmp как их сравнить, так чтобы условие оказалось true тоесть картинки одинаковы... опятьже, на картинке1 цифра может быть выше или ниже...

Хелп...
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.08.2005 (Пт) 13:39

Э ... я как нехороший человек в своё время когда ещё только познакомился с любимой девушкой ... задался вопросом как сохранить картинки, передаваемые MSN Web-камерой.Сначала я сделал так что у меня прога принтскринила кртинки и сохраняла в файл каждые 0,1 сек но тут я столкнулся с траблой - картинки обновляются намного реже и у меня в директории было полным полно дубликатов.
Вообщем думал я не особо долго навоял программу, котрая сравнивает две картинки причем не все пикселы, а лишь определенные (к примеру с шагом в 20 пикселов). Если точки по цветам совпадали - значит не менялась картинка ... я и не сохранял. В итоге теперь можно делать анимашки из тех картинок:)

Теперь к твоей проблеме. Я предлагаю тебе такое решение .... возможно не самое лучшее, сравни кол-во черных точек, ну или проще говоря НЕ БЕЛЫХ точек...:)

И вот ещё что, каждая цифра имеет свою ширину? ии они стандартны например 8х12
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.08.2005 (Пт) 13:56

А вот решение, которое мне пришло в голову ... сразу.

Короче - сканишь всю картинку целиком.


Код: Выделить всё
Dim Fragments() as Long
ReDim Fragments(0)
Picture1.ScaleMode= 3
Picture1.AutoSize = True

For J = 0 to Picture1.Width - 1 
  LastPCount = PCount
  PCount = 0
  For I = 0 to Picture1.Height-1
     IF Picture1.Point(J,I) <> RGB(255,255,255) THEN PCount=PCount+1
  Next I
  'Здесь мы тестим
  If LastPCount=0 And PCount<>0 Then
    'Это когда мы создаем новый элемент
    Redim Preserve Fragments(Ubound(Fragments)+1)
    Fragments(Ubound(Fragments)) = PCount
  End if

  If LastPCount<>0 And PCount<>0 Then
    'Это когда мы считаем точки в элементе
    Fragments(Ubound(Fragments)) = Fragments(Ubound(Fragments)) + PCount
  End if
Next J


Вообщем, на выходе долен получится массив, где кол-во элементов должно быть равно кол-ву знаков.
После этого можно посмотреть по кол-ву точек.
Последний раз редактировалось SSecurity 12.08.2005 (Пт) 14:09, всего редактировалось 1 раз.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 12.08.2005 (Пт) 14:03

Jenizix, У тебя между цифрами есть пробелы по горизонтали в 1 пиксел.
Просматривешь все строки по вертикали, если вся белая - значит промежуток.
Разделяешь картинку на несколько картинок с одной цифрой на каждой.
Дальше путём анализирования строк по горизонтали и вертикали можно отрезать пустоту и у тебя получатся картинки с ровно написаными цифрами без лишнего белого вокруг - вот и сравнивай!
Программисты не глючат - глючат компиляторы...

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.08.2005 (Пт) 14:13

Мой способ не прокатит:)
Там точек одинаково:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.08.2005 (Пт) 14:52

Вот рабочий алгоритм, поподставляешь значения в Case, как определишься с остальными числами пока они будут выдаваться как "X":)

Он без картинок тебе циферки даст:)

Код: Выделить всё
Function strCode() as String
Dim Fragments() as long
ReDim Fragments(0)
For J = 0 To Picture1.Width - 1
  LastPCount = PCount
  PCount = 0
  For i = 0 To Picture1.Height - 1
     
     If Picture1.Point(J, i) = RGB(0, 0, 0) Then PCount = PCount + 1
     
  Next i
  'Здесь мы тестим
  If LastPCount = 0 And PCount <> 0 Then
    'Это когда мы создаем новый элемент
    ReDim Preserve Fragments(UBound(Fragments) + 1)
    Fragments(UBound(Fragments)) = PCount
  End If

  If LastPCount <> 0 And PCount <> 0 Then
    'Это когда мы считаем точки в элементе
    Fragments(UBound(Fragments)) = Fragments(UBound(Fragments)) * PCount
  End If
Next J
strCode = ""
For i = 1 To UBound(Fragments)
   Select Case Fragments(i)
     Case 128: strCode = strCode & "0"
     Case 32: strCode = strCode & "1"
     Case 180: strCode = strCode & "3"
     Case 540: strCode = strCode & "6"
     Case 675: strCode = strCode & "8"
     Case Else: strCode = strCode & "X"
   End Select
Next i
End Function
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 12.08.2005 (Пт) 15:27

Нейросети вам в помощь. :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 12.08.2005 (Пт) 16:37

Вот тебе прогу накатал, рисует символы выбранным шрифтом со сдвигом по вертикали и потом распознаёт их все.
Вложения
FOnts.rar
(1.54 Кб) Скачиваний: 51
Программисты не глючат - глючат компиляторы...

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 14.08.2005 (Вс) 1:48

Вот тут по теме есть:
Вложения
index.zip
(157.4 Кб) Скачиваний: 27
Удачи!
С уважением, Алексадр.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 14.08.2005 (Вс) 7:32

BV писал(а):Нейросети вам в помощь. :)

Пробовал разобраться и забросил. Потом написал прогу которая распозновала цифры. И учитель к ней. Прога работала по анализу горизонтальных, вертикальных и диагональных отрезков, цифры распозновала на ура все какие только можно по паре примеров (правда на цифры 6,8,9,0 был свой алгоритм, но это уже детали).
Теперь по теме, а что так трудно найти первый пискель сбоку, отступить n клеток вправо и в этом пространстве найти первый сверху и снизу? Вот вам и границы картинки, а остальное если шрифт один, дело техники.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 15.08.2005 (Пн) 11:49

Я же уже скинул пример, который всё делает, а вы всё продолжаете толочь воду в ступе...
Программисты не глючат - глючат компиляторы...

v-adix
Постоялец
Постоялец
 
Сообщения: 490
Зарегистрирован: 14.11.2002 (Чт) 15:11

Сообщение v-adix » 15.08.2005 (Пн) 15:00

можно наложить изображения: цифру из картинки 2 на цифру из картинки 1. потом анализировать полученное изображение ... если результат совпадает с цифрой 1 (или с цифрой 2) - то цифры одинаковы , если нет - то разные.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

    TopList