OpenCV и компьютерное зрение

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 26 окт 2016, 12:55

Lepton писал(а):
Olej писал(а): негде взять файлы данных (.jpg, .xml) чтобы воспроизвести пример,.
Каскадный классификатор Хаара можно найти в сети (можно взять haarcascade_frontalface_default.xml здесь: http://alereimondo.no-ip.org/OpenCV/34).
Каскадных классификаторов представлено во множестве и после установки пакетов opencv-devel* (внутри):

Код: Выделить всё

[olej@dell OpenCV]$ pwd
/usr/share/OpenCV

[olej@dell OpenCV]$ ls lbpcascades
lbpcascade_frontalcatface.xml  lbpcascade_frontalface.xml  lbpcascade_profileface.xml  lbpcascade_silverware.xml

[olej@dell OpenCV]$ ls haarcascades
haarcascade_eye_tree_eyeglasses.xml      haarcascade_lefteye_2splits.xml             haarcascade_mcs_rightear.xml
haarcascade_eye.xml                      haarcascade_licence_plate_rus_16stages.xml  haarcascade_mcs_righteye.xml
haarcascade_frontalcatface_extended.xml  haarcascade_lowerbody.xml                   haarcascade_mcs_upperbody.xml
haarcascade_frontalcatface.xml           haarcascade_mcs_eyepair_big.xml             haarcascade_profileface.xml
haarcascade_frontalface_alt2.xml         haarcascade_mcs_eyepair_small.xml           haarcascade_righteye_2splits.xml
haarcascade_frontalface_alt_tree.xml     haarcascade_mcs_leftear.xml                 haarcascade_russian_plate_number.xml
haarcascade_frontalface_alt.xml          haarcascade_mcs_lefteye.xml                 haarcascade_smile.xml
haarcascade_frontalface_default.xml      haarcascade_mcs_mouth.xml                   haarcascade_upperbody.xml
haarcascade_fullbody.xml                 haarcascade_mcs_nose.xml
Lepton писал(а): Ну а "картинок" в интернет полно :lol:
А картинки к примерам кода имеют смысл когда они придаются к коду, чтобы можно было воспроизвести тот эксперимент и результат, который получают авторы - это первичная проверка корректности воспроизведения примера ... уже после этого можно прогонять пример на множестве разнообразных данных.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 29 окт 2016, 19:28

Olej писал(а): Интересные статьи:
Документация ... справочные страницы по API, которых вполне достаточно, чтобы писать код C/C++:
OpenCV 2.4.12.0 documentation
class Mat
OpenCV C++ n-dimensional dense array class
+ все методы этого класса.
Кстати, вполне может пригодиться и не для OpenCV вовсе, а вообще для кода линейной алгебры, векторно-матричной...

OpenCV 3.1.0 - Документация по версии 3.1.0
Open Source Computer Vision
Examples
Here is a list of all examples:
  • contours2.cpp
  • convexhull.cpp
  • cout_mat.cpp
  • demhist.cpp
  • distrans.cpp
  • edge.cpp
  • ffilldemo.cpp
  • filestorage.cpp
  • fitellipse.cpp
  • grabcut.cpp
  • houghcircles.cpp
  • houghlines.cpp
  • kmeans.cpp
  • laplace.cpp
  • lsd_lines.cpp
  • minarea.cpp
  • morphology2.cpp
  • pca.cpp
  • polar_transforms.cpp
  • segment_objects.cpp
  • watershed.cpp

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 29 окт 2016, 19:55

Olej писал(а):Документация по версии 3.1.0
(фиксирую для себя ссылки)
Вот здесь документация по всем существующим версиям, списком на выбор:
Documentation
Versions 3.* (branch master)

Nightly 3.x docs
Release 3.1.0
Release 3.0.0
Release 3.0-rc1
Last Shpinx documentation snapshot
Release 3.0-beta
Release 3.0-alpha

Versions 2.* (branch 2.4)

Nightly 2.4.x docs
Release 2.4.13
Release 2.4.12
Release 2.4.11
Release 2.4.10
Release 2.4.9
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 29 окт 2016, 20:05

Olej писал(а): Вот здесь документация по всем существующим версиям, списком на выбор:
С версиями OpenCV тоже вот такая ... не совсем понятная картина...
На сайте OpenCV в разделе Download (можете там скачивать исходники проекта для сборки и установки):
Изображение
2016-05-19
VERSION 2.4.13
OpenCV for Windows
OpenCV for Linux/Mac
OpenCV for iOS

2015-12-21
VERSION 3.1
OpenCV for Windows
OpenCV for Linux/Mac
OpenCV for Android
OpenCV for iOS

2015-07-30
VERSION 2.4.12
OpenCV for Windows
OpenCV for Linux/Mac

2015-06-04
VERSION 3.0
OpenCV for Windows
OpenCV for Linux/Mac
OpenCV for Android
OpenCV for iOS
...
Т.е. 2 линии версий, 2.Х и 3.Х, существуют в параллель, и развиваются (по времени) впересыпку...
Это похоже на состояние дел с Python: Python 2 и Python 3 сосуществуют уже что-то порядка 10 лет...
Во всех последних дистрибутивах Linux в репозиториях присутствуют (там где они присутствуют :lol: ) только версии линейки 2.4, порядка такого:

Код: Выделить всё

[root@dell log]# dnf list 'opencv*'
Последняя проверка окончания срока действия метаданных: 2:59:11 назад, Sat Oct 29 17:05:31 2016.
Установленные пакеты
opencv.x86_64                                                     2.4.12.3-1.fc23                                          @updates
opencv-core.x86_64                                                2.4.12.3-1.fc23                                          @updates
opencv-devel.x86_64                                               2.4.12.3-1.fc23                                          @updates
opencv-devel-docs.noarch                                          2.4.12.3-1.fc23                                          @updates
opencv-python.x86_64                                              2.4.12.3-1.fc23                                          @updates
Доступные пакеты
opencv.i686                                                       2.4.12.3-1.fc23                                          updates 
opencv-core.i686                                                  2.4.12.3-1.fc23                                          updates 
opencv-devel.i686                                                 2.4.12.3-1.fc23                                          updates 
P.S. Но в версиях 3.Х есть существенные алгоритмы, которых нет в 2.Х.
С этим нужно разобраться!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 29 окт 2016, 20:31

Olej писал(а): С версиями OpenCV тоже вот такая ... не совсем понятная картина...
Как в динамике определить текущую (установленную) использующуюся версию OpenCV?
(это достаточно актуально, поскольку OpenCV - это библиотеки, а не приложение)

- Python:

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2
# Print version string
print "OpenCV version : {0}".format(cv2.__version__)
# Extract major, minor, and subminor version numbers
(major_ver, minor_ver, subminor_ver, xxx) = (cv2.__version__).split('.')
print "Major version : {0}".format(major_ver)
print "Minor version : {0}".format(minor_ver)
print "Submior version : {0}".format(subminor_ver)

Код: Выделить всё

[olej@dell openCV]$ python2 version.py 
OpenCV version : 2.4.12.2
Major version : 2
Minor version : 4
Submior version : 12
- C++

Код: Выделить всё

#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv ) {
   cout << "OpenCV version : " << CV_VERSION << endl;
   cout << "Major version : " << CV_MAJOR_VERSION << endl;
   cout << "Minor version : " << CV_MINOR_VERSION << endl;
   cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
}

Код: Выделить всё

[olej@dell openCV]$ g++ version.cc -oversion

[olej@dell openCV]$ ./version
OpenCV version : 2.4.12.2
Major version : 2
Minor version : 4
Subminor version : 12
Вложения
version.py
(399 байт) 178 скачиваний
version.cc
(353 байт) 162 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 29 окт 2016, 20:50

Olej писал(а): На сайте OpenCV в разделе Download (можете там скачивать исходники проекта для сборки и установки):
Здесь вот в ответах авторов проекта OpenCV, есть реплика от читателя, который реально собирал OpenCV 3.1 под достаточно стареньким CentOS 6.6:
answered Feb 16 '16

Код: Выделить всё

yum groupinstall "Development Tools"
yum install cmake
yum install python-devel
yum install numpy
mkdir build
cd build
cmake ../opencv
make -j4
Then you don't need to install python-devel and numpy. They are not required, but they have been successfully detected by cmake and used during the build in my case (python-2.6.6 and numpy-1.4.1).

И это должно срабатывать в любом Linux.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 04 ноя 2016, 12:32

Очень интересный и очень нужный проект LSD (a Line Segment Detector), здесь можно скачать .zip исходников: Download v.1.6, и при желании предыдущих версий: 1.0 и 1.5.
Здесь вот можно скачать PDF публикацию (21 стр.) 2012 года LSD: a Line Segment Detector, Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall - математическое обоснование методов ... там очень приличная математика.
Там же - online на странице обработка ваших собственных изображений - загружайте файлы и получайте результаты.

Сборка проекта не вызывает сложностей - в распакованном архиве:

Код: Выделить всё

[olej@dell lsd_1.6]$ make
cc -O3 -o lsd lsd_cmd.c lsd.c -lm
cc -o lsd_call_example lsd_call_example.c lsd.c -lm

[olej@dell lsd_1.6]$ file lsd 
lsd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=42f71e62623cb9ee25af4a38bf6391c484971c00, not stripped

[olej@dell lsd_1.6]$ file lsd_call_example 
lsd_call_example: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d3950139f54a09bdda3ab98c2442b36f606e8363, not stripped
2-е приложение - для проверки работоспособности:

Код: Выделить всё

[olej@dell lsd_1.6]$ ./lsd_call_example
1 line segments found:
63.595665 0.625000 63.595665 126.875000 1.250000 0.125000 80.106510 
При обработке .jpg файла (и любого другого графического формата) получите ошибку:

Код: Выделить всё

[olej@dell lsd_1.6]$ ./lsd ../../bad_1.jpg xxx
Error: not a PGM file!
Это потому, что приложение lsd работает только с чёрно-белым изображением PGM.
Для предварительной подготовки (конвертации) файлов можно использовать команду convert из общеизвестного пакета ImageMagick.

В версии 3.Х OpenCV LSD алгоритм включен в состав пакета: class cv::LineSegmentDetector.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 04 ноя 2016, 12:46

Olej писал(а):Это потому, что приложение lsd работает только с чёрно-белым изображением PGM.
Для предварительной подготовки (конвертации) файлов можно использовать команду convert из общеизвестного пакета ImageMagick.

Код: Выделить всё

[olej@dell openCV]$ convert --version
Version: ImageMagick 6.9.2-7 Q16 x86_64 2015-12-06 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP 
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib jbig jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib

[olej@dell openCV]$ convert bad_2.jpg bad_2.pgm

[olej@dell openCV]$ file bad_2.pgm 
bad_2.pgm: Netpbm PGM "rawbits" image data, size = 1024 x 768

Код: Выделить всё

[olej@dell lsd_1.6]$ ./lsd bad_1.pgm xxx

[olej@dell lsd_1.6]$ ls -l xxx
-rw-rw-r-- 1 olej olej 38136 окт 26 17:38 xxx

[olej@dell lsd_1.6]$ cat xxx | wc
    528    3696   38136
Каждая строка выходного (текстового) файла - описание одного отрезка линии из 7 значений:

Код: Выделить всё

[olej@dell lsd_1.6]$ cat xxx | tail -n1 
275.895630 19.360893 276.873725 38.125066 1.768855 0.125000 5.472955 
Из документации (в моём горбатом переводе):
Каждая строка состоит из семи цифр, разделенных пробелами, которые х1, У1, х2, У2, протяжённость, угол П, -log_nfa. Например, строка:
159.232890 134.369601 160.325338 105.613616 2.735466 0.125000 17.212465
- означает, что отрезок, начиная с точки (159.232890,134.369601), заканчивающийся в точке (160.325338 105.613616)
и длиной 2.735466 был обнаружен. Угол точности П от 0.125 использовалось, что означает градиент допуска по углу
PI*180 = 0.125*180 = 22,5 градусов. Обратный логарифм по основанию 10 от NFA детектирования -log_10(НФА)=17.212465,
поэтому уровень NFA был 10^(-17.2124656), примерно 6е-18.
Единицы измерения длины служит точка и начало координат является центром верхнего левого пикселя (0,0).
Наконец, мы определим вероятность ложного срабатывания (NFA), связанную с линией.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 04 ноя 2016, 14:32

Olej писал(а):Очень интересный и очень нужный проект LSD (a Line Segment Detector),
Эта штука может оказаться очень удачной для построения для построения различных дискриминантеров различных образов-изображений.

Для получения файла выделенных линий из изображения любого формата используем команду типа:

Код: Выделить всё

[olej@dell RECT]$ convert r1.jpg -type Grayscale pgm:- | ./lsd - r1.line

[olej@dell RECT]$ ls -l r1.line
-rw-rw-r-- 1 olej olej 6186 ноя  4 13:24 r1.line

[olej@dell RECT]$ wc r1.line
  88  616 6186 r1.line
А для чтения набора линий (в тестовом варианте, чтобы не писать полностью свой код) непосредственно в C/C++ код используем что-то типа такого:

Код: Выделить всё

char fcommand[ 80 ] = "convert %s -type Grayscale %s pgm:- | ./lsd - %s -",
       command[ 80 ];
sprintf( command, fcommand, argv[ optind ], opc, opl, group.c_str() ); // opc, opl - любые опции программ 
FILE *pipe = popen( command, "r" );
char buf[ 80 ], *p = buf;
while( true ) {
   if( 0 == fread( p, 1, 1, pipe ) ) break;
   if( *p++ != '\n' ) 
      continue;
   else
      p = buf;
   float x1, y1, x2, y2, width, p, log_nfa; // строка линии
   if( sscanf( buf, "%f%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &width, &p, &log_nfa ) != 7 )
      exit( 1 );
   // заполняем куда-то (массив, вектор, ...) очередную строку линии
}
fclose( pipe );

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: OpenCV и компьютерное зрение

Непрочитанное сообщение Olej » 14 дек 2016, 16:08

Хорошие статьи (с дальнейшими ссылками) по обучению классификатора образов:

Обучение OpenCV каскада Хаара
Мальцев Антон
4 января 2014
В этой статье я попробую показать, как обучить каскад с нуля за несколько часов, натренировав на поиск простого предмета в видеопотоке
Классификация и выделение объектов на изображениях
Фесенко Игорь
16 ноября 2010
В связи со сферой своей деятельности, собрался, на мой взгляд, очень ценный материал, которым хочу поделиться с вами.
Подборку буду продолжать...

Ответить

Вернуться в «Программирование»

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

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