Перейти к содержимому
Compvision.ru
dtritus

Распознавание чисел с картинки

Recommended Posts

Есть картинка, на которой изображены прямоугольники(фото 1) в которые выводят численные значения. На этой картинке множество таких прямоугольников, их координаты известны. Задача получить все численные значения с картинки из прямоугольников. Я получаю все прямоугольники по очереди, привожу картинку в ч/б вид(фото 2), выделяю контуры(фото 3) и отделяю все цифры (фото 4). Далее по теории я должен сравнить с образцом но как - затуп у меня возник.

1. подскажите плиз куда копать - как сравнить с образцом, какие функции использовать и тд? 

2.я выделяю контуры, а они идут в свободном порядке, т.е. мне нужно слева - направо (чтобы на каком месте идёт точка), а она обычно в самом начале лежит. (точка кстати просто черным квадратом маленьким получается)

3. любые мысли по поводу правильности моих действий

1.png

2.png

3.png

4.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В дополнительном репозитории opencv_contrib уже есть алгоритмы поиска и распознавания текста с картинки. Делается это как с помощью установленного заранее в системе tesseract, так и внутренними алгоритмами. Я бы начал с проверки работоспособности этого модуля для твоих данных (примеры уже есть, надо просто скомпилировать и запустить на своей картинке). Думаю, что он прекрасно справится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В дополнительном репозитории opencv_contrib уже есть алгоритмы поиска и распознавания текста с картинки. Делается это как с помощью установленного заранее в системе tesseract, так и внутренними алгоритмами. Я бы начал с проверки работоспособности этого модуля для твоих данных (примеры уже есть, надо просто скомпилировать и запустить на своей картинке). Думаю, что он прекрасно справится.

А необходимо пересобирать библиотеку opencv с добавлением этого модуля или  можно просто запустить и скомпилить модуль?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А необходимо пересобирать библиотеку opencv с добавлением этого модуля или  можно просто запустить и скомпилить модуль?

в билдовой папке в строку cmake'у добавляешь -DOPENCV_EXTRA_MODULES_PATH=<path to opencv_contrib> и пересобираешь. Ребилд будет инкрементальный без пересборки самой библиотеки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в билдовой папке в строку cmake'у добавляешь -DOPENCV_EXTRA_MODULES_PATH=<path to opencv_contrib> и пересобираешь. Ребилд будет инкрементальный без пересборки самой библиотеки.

Пардон, но толком не понял куда добавлять, опишите подробней для новичка, пожалуйста. Есть папка с которой я работал в CMake, после обработки запуска билд в ms visual получилась папка install - её и использовал как библиотеку. Куда конкретно добавить строку? и что после этого сделать? Собрать ещё раз в CMake или только в vs?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пардон, но толком не понял куда добавлять, опишите подробней для новичка, пожалуйста. Есть папка с которой я работал в CMake, после обработки запуска билд в ms visual получилась папка install - её и использовал как библиотеку. Куда конкретно добавить строку? и что после этого сделать? Собрать ещё раз в CMake или только в vs?

Оу, как в ms vs собирать его я не в курсе.

Я это делаюи примерно так (в консоли):

mkdir opencv_work_dir

cd opencv_work_dir

git clone https://github.com/Itseez/opencv.git

git clone https://github.com/Itseez/opencv_contrib.git

mkdir build

cd build

cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/  ../opencv

make -j8 (в Windows наверно nmake можно сделать)

Как-то так. В GUI у CMake скорей всего есть отдельный propertiy, который называется OPENCV_EXTRA_MODULES_PATH, куда надо вписать путь до контрибных модулей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оу, как в ms vs собирать его я не в курсе.

Я это делаюи примерно так (в консоли):

mkdir opencv_work_dir

cd opencv_work_dir

git clone https://github.com/Itseez/opencv.git

git clone https://github.com/Itseez/opencv_contrib.git

mkdir build

cd build

cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/  ../opencv

make -j8 (в Windows наверно nmake можно сделать)

Как-то так. В GUI у CMake скорей всего есть отдельный propertiy, который называется OPENCV_EXTRA_MODULES_PATH, куда надо вписать путь до контрибных модулей.

а что у тебя после этого получается ? Полноценная библиотека? Просто я ещё потом открываю полученный проект после смейка в студии и делаю билд. А уже потом получаю библиотеку и её цепляю к своему проекту. я пробовал через gui ставил там этот параметр но после отработки в cmake в студии opencv не сбилдилась

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а что у тебя после этого получается ? Полноценная библиотека? Просто я ещё потом открываю полученный проект после смейка в студии и делаю билд. А уже потом получаю библиотеку и её цепляю к своему проекту. я пробовал через gui ставил там этот параметр но после отработки в cmake в студии opencv не сбилдилась

Нуу....make (nmake в Windows) на выходе должен выплевывать готовые бинарники. в MSVS вроде бы нужно будет только пути до них и до инклюдов прописать, чтобы подключить к проекту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нуу....make (nmake в Windows) на выходе должен выплевывать готовые бинарники. в MSVS вроде бы нужно будет только пути до них и до инклюдов прописать, чтобы подключить к проекту.

А модули они к любой версии библиотеки подходят или только к 3? И к примеру мне нужен модуль text: EXTRA_MODULES_PATH=...\opencv_contrib-master\modules\text\include\opencv2 ?

Изменено пользователем dtritus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А модули они к любой версии библиотеки подходят или только к 3? И к примеру мне нужен модуль text: EXTRA_MODULES_PATH=...\opencv_contrib-master\modules\text\include\opencv2 ?

экстра модули из opencv_contrib пишутся для opencv3, на 2.4 теоретически можно портировать, но иногда проще с нуля написать модуль, чем переносить между этими версиями.

нет, в OPENCV_EXTRA_MODULES_PATH прописывается путь до папки modules: <path_to_opencv_contrib>/modules

А потом нужные модули включаются/выключаются cmake-командами -DBUILD_<module_name>=ON/OFF или -DWITH_<module_name>=ON/OFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

экстра модули из opencv_contrib пишутся для opencv3, на 2.4 теоретически можно портировать, но иногда проще с нуля написать модуль, чем переносить между этими версиями.

нет, в OPENCV_EXTRA_MODULES_PATH прописывается путь до папки modules: <path_to_opencv_contrib>/modules

А потом нужные модули включаются/выключаются cmake-командами -DBUILD_<module_name>=ON/OFF или -DWITH_<module_name>=ON/OFF

Спасибо, вроде подсоединил. Собрал под v3. Понял что надо все модули сначала указывать, а то до этого думал только необходимый в CMake подставлять. Сейчас смотрю что в них.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ещё вопрос а чем отличаются файлы которые мы includ'им в папках opencv и opencv2 

#include  "opencv/highgui.h"
/*or*/
#include  "opencv2/highgui/highgui.hpp"

И какие предпочтительней использовать? У меня просто возникает ошибка линковки (См. рисунок). Ругается на imread:

Mat src = imread("1.bmp", CV_LOAD_IMAGE_COLOR);

Вроде либы добавил в проект, инклуды прописал.

На всякий случай вот эти либы добавил (opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_ts300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_video300d.lib
opencv_videostab300d.lib
opencv_text300d.lib
opencv_ccalib300d.lib)

И эти инклуды прописал:

#include <opencv2/opencv.hpp>
#include  "opencv2/text.hpp"
#include  "opencv2/highgui/highgui.hpp"
#include  "opencv2/imgproc/imgproc.hpp"

#include  <vector>
#include  <iostream>
#include  <iomanip>

 

фыв.png

Изменено пользователем dtritus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

opencv2 обычно хранит C++ версию, ее и предпочтительно использовать, а в opencv лежат версии с C интерфейсом.

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

И еще, если исходники Opencv лежат в папке с названием содержащим пробелы, и проект генерируется CMAKE ом, то в путях к библиотекам полный бардак.

Можно поправить вручную файл OpenCVConfig.cmake в директории проекта OpenCV сгенерированного CMAKE-ом.

# ==============================================================
#  Extra include directories, needed by OpenCV 2 new structure
# ==============================================================
SET(OpenCV2_INCLUDE_DIRS 
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudev/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/hal/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/core/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudaarithm/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/flann/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/imgproc/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/ml/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/video/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/viz/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudabgsegm/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudafilters/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudaimgproc/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudawarping/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/imgcodecs/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/photo/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/shape/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/videoio/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudacodec/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/highgui/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/objdetect/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/ts/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/features2d/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/calib3d/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudafeatures2d/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudalegacy/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudaobjdetect/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudaoptflow/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/cudastereo/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/stitching/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/superres/include";
"E:/Documents/Visual Studio 2013/Projects/opencv-master/modules/videostab/include")

Изменено пользователем Smorodov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На счёт opencv и opencv2 понял. Версии библиотек для каждой конфигурации проекта указаны свои. Пробелов в пути нету.

В чём проблема пока что не пойму. Вот код который пытаюсь скомпилить. Это пример из opencv доп. модуля text. Какие нибудь ещё мысли есть?

/*
* cropped_word_recognition.cpp
*
* A demo program of text recognition in a given cropped word.
* Shows the use of the OCRBeamSearchDecoder class API using the provided default classifier.
*
* Created on: Jul 9, 2015
*     Author: Lluis Gomez i Bigorda <lgomez AT cvc.uab.es>
*/

#include "opencv2/text.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::text;

int main(int argc, char* argv[])
{

	cout << endl << argv[0] << endl << endl;
	cout << "A demo program of Scene Text Character Recognition: " << endl;
	cout << "Shows the use of the OCRBeamSearchDecoder::ClassifierCallback class using the Single Layer CNN character classifier described in:" << endl;
	cout << "Coates, Adam, et al. \"Text detection and character recognition in scene images with unsupervised feature learning.\" ICDAR 2011." << endl << endl;

	Mat image;
	if (argc>1)
		image = imread(argv[1]);
	else
	{
		cout << "    Usage: " << argv[0] << " <input_image>" << endl;
		cout << "           the input image must contain a single character (e.g. scenetext_char01.jpg)." << endl << endl;
		return(0);
	}

	string vocabulary = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // must have the same order as the clasifier output classes

	Ptr<OCRHMMDecoder::ClassifierCallback> ocr = loadOCRHMMClassifierCNN("OCRBeamSearch_CNN_model_data.xml.gz");

	double t_r = (double)getTickCount();
	vector<int> out_classes;
	vector<double> out_confidences;

	ocr->eval(image, out_classes, out_confidences);

	cout << "OCR output = \"" << vocabulary[out_classes[0]] << "\" with confidence "
		<< out_confidences[0] << ". Evaluated in "
		<< ((double)getTickCount() - t_r) * 1000 / getTickFrequency() << " ms." << endl << endl;

	return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть :)

Еще с тем же результатом можно пытаться подключить x32 либы к x64 проекту и наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть :)

Еще с тем же результатом можно пытаться подключить x32 либы к x64 проекту и наоборот.

А как Вы узнали что либы х64? Я собирал opencv под х32. 

 

Изменено пользователем dtritus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А проект ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А проект ? 

Проект тоже под х32. Собрал opencv 3 + modules в CMake под vs 2015. потом билд в vs 2015. получил библиотеки и их подключаю к проекту на x32 

Изменено пользователем dtritus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обычно когда архитектура не соответствует, линкер "не видит" библиотек, даже если они подключены, хотя и ошибок что "не найдено" не выдает. Но у Вас должно быть все нормально, если и то и другое x32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обычно когда архитектура не соответствует, линкер "не видит" библиотек, даже если они подключены, хотя и ошибок что "не найдено" не выдает. Но у Вас должно быть все нормально, если и то и другое x32.

Попробовать пересобрать библиотеку ещё раз? Я делал по такому алгоритму :

Get Cmake. In in C:\OpenCV-3.0.0, make a folder called “mybuild”.
Start Cmake-gui. For “where is the source code”, put C:/OpenCV-3.0.0/sources. For where to build binaries, put C:/OpenCV-3.0.0/mybuild.
Click “configure”. For what “generator” to use, you can use “Visual Studio 14 2015” (this is for 32 bit) or “Visual Studio 14 2015 Win64” (this is for 64 bit). I’m guessing the latter is better/faster? I had to uncheck “With VTK”; I don’t know why this was checked in the first place. Click “configure” again until all entries are white, not red.
Click “generate”. This will create a Visual Studio “sln” file in C:/OpenCV-3.0.0/mybuild. Close cmake.

In C:/OpenCV-3.0.0/mybuild, double click on “OpenCV.sln”. Now, if you have chosen the generator“Visual Studio 14 2015 Win64” in cmake, your visual studio project should be set to “x64” as the configuration at the top. It is probably set to “Debug” as well; that’s ok.
After it is done “parsing”, go to “ALL_BUILD” in the “Solutions Explorer” window. Right click on that and choose “Build”. This will create all the “lib” and “dll” files for debugging. On my Surface (Windows 8.1) I get a popup message saying “Microsoft ® C/C++ Optimizing Compiler has stopped working”. I close that window and it still seems to compile ok. There are two “failures” but it seems to be a problem with building some test program.
Change “Debug” to “Release”, and recompile (by right clicking on “ALL_BUILD”. This will create all the “lib” and “dll” files for the release versions.
I then right clicked on “INSTALL” under “CMakeTargets” for both Debug and Release. This combines all the lib and dll files into a single “lib” and a single “bin” folder. Mine went into: C:\OpenCV-3.0.0\mybuild\install\x64\vc14\lib and C:\OpenCV-3.0.0\mybuild\install\x64\vc14\bin.
I then moved C:\OpenCV-3.0.0\mybuild\install to C:\OpenCV-3.0.0\install.
I then added C:\OpenCV-3.0.0\install\x64\vc14\bin to the system PATH.

Делал всё под х32. Правильный алгоритм? Может ошибка при сборке

Проблема решена с помощью подключения в линкер opencv_imgcodecs300d.lib и opencv_imgcodecs300.lib, соответственно. Буду теперь разбираться по теме сабжа, собственно))) Спасибо.

Изменено пользователем dtritus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, точно, забыл про них (imgcodecs, video и videoio) и , в последнее время на 2.4. сижу.

Изменено пользователем Smorodov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если ещё актуально и шрифт известен, то можно сделать следующим образом:

1. Создаёшь базу бинаризованных шаблонов цифр стандартного размера, например 20х30 пикселей.

2. После вырезания очередного символа из изображения (тут он уже в бинаризованном виде как я понял) делаешь его ресайз к стандартному размеру. Здесь изображение символа станет в оттенках серого, повторяешь бинаризацию.

3. Проводишь XOR (в opencv bitwise_xor) между изображением символа и всеми изображениями шаблонов и каждый раз считаешь количество различающихся пикселей. Где оно будет наименьшим, с тем символом больше всего похоже. Тут ещё стоит сравнивать с некоторым порогом, т.е. всего у нас получается 600 пикселей (20 на 30), если наименьшее количество различающихся пикселей больше, к примеру, 150, то считаем символ не распознанным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 26.11.2015 at 15:30, APXANGEL said:

3. Проводишь XOR (в opencv bitwise_xor) между изображением символа и всеми изображениями шаблонов и каждый раз считаешь количество различающихся пикселей. Где оно будет наименьшим, с тем символом больше всего похоже.

Вопрос: количество различающихся пикселей, это и есть результат работы функции bitwise_xor? Т.е. нужно просуммировать все  белые пиксели?

Как я понял если два изображение идентичны, то на результирующем изображении белых пикселей не будет. Если же есть отличая, то появляются белые пиксели. Я прав?

 

В 26.11.2015 at 15:30, APXANGEL said:

2. После вырезания очередного символа из изображения (тут он уже в бинаризованном виде как я понял) делаешь его ресайз к стандартному размеру. Здесь изображение символа станет в оттенках серого, повторяешь бинаризацию.

Стандартный размер символа - это, как я понял, размер символа из базы шаблонов? Все к этому размеру приводить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 просто все суммируете, у черных знание и так будет 0

2 Тут уж на вше усмотрение, главное или все приводить к размеру в базе или все к размеру распознаваемого символа, но удобнее будет к размеру базы.

Ну, а вообще не факт что с бинаризвацией результат будет лучше чем без нее, стоит попробовать и так и так и выбрать. Или вообще сделать две базы, два сравнение и вбирать каждый раз с лучшим результатом (или суммировать как то)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ!

А есть функция opencv для подсчета суммы пикселей? 

У меня получается изображение со значениями пикселей 0 или 255 (после бинаризации). Я так понимаю это значит, что изображение у меня в градациях серого.

Есть ли возможность перевести его в формат черно-белого, что бы пиксели принимали значение 1 или 0?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×