Поиск объектов на изображении является одной из важнейших составляющих компьютерного зрения. На сегодняшний момент существует множество способов выделения объектов на изображении, таких как выделение по цвету, по яркости, по структуре. В этой статье описывается попытка создания компьютерной программы которая могла бы выделять зелёные объекты на изображении в реальном времени.

Рассмотрим в начале задачу, в которой программа ищет только один объект. Изображение состоит из множества отдельных частей, пикселей и наша задача сводится к нахождению массива пикселей одого цвета, в нашем случае зелёного. Будем считать, что зелёный пиксель это такой пикскль у которого зелёная составляющая его цвет (по RGB) больше других составляющих на какой-то определённый коэффициент k. Коэффициент может варьироваться в зависимости от освещённости и от яркости зелёного цвета для лучшего распознавания объекта. Проверив все пиксели на такое условие можно получить массив G всех зелёных пикселей, на изображении. Так как мы считаем, что на изображении всего один объект то массив G содержит только пиксели этого объекта. Его центр по сути является его центрам масс и его координаты можно определить сложив между собой координаты всех его составляющих и разделив их сумму на их количество. Такой способ определения зелёного объекта является простыи и как показали опыты рабочим, но его можно усложнить введя вероятность принадлежности пикселя к объекту.

Continue reading »

 

Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению. Приведу два алгоритма один рекурсивный, а второй линейный. Рекурсивный имеет один недостаток, его нельзя использовать для закрашивания больших фигур так как при большом количестве элементов происходит переполнение стека. Код использует OpenCV для работы с изображениями, но при желании их можно переписать под что угодно.

Continue reading »

 

Небольшая программа демонстрирующая работу с отдельной прямоугольной областью на изображении. Программа загружает изображение из файла image.jpg выделяет на нем область (cvSetImageROI) и с помощью функции cvAddS уменьшает каждую составляющую всех выделенных пиксей на 100, затем выделение сбрасывается вызовом функции cvResetImageROI.

#include "highgui.h"
#include "cv.h"
 
int main(int argc, char* argv[])
{
 IplImage* src = cvLoadImage("image.jpg");
 int x = 0;
 int y = 0;
 int width = 200;
 int height = 100;
 
 cvSetImageROI(src, cvRect(x,y,width,height));
 cvAddS(src, cvScalar(-100,-100,-100),src);
 cvResetImageROI(src);
 
 cvNamedWindow( "SetROI", 1 );
 cvShowImage( "SetROI", src );
 cvWaitKey();
 return 0;
}
 

Приведенный ниже пример кода накладывает текст в нужную позицию заданным цветом.

// Текстовый буффер
char text_buf[32];

//Текст в массив
sprintf(text_buf,"Hello!!!");
 
//Шрифт
CvFont myFont;
cvInitFont(&myFont, СV_FONT_HERSHEY_PLAIN, 0.7, 1, 0, 1, 8);
 
//Вывод текста
cvPutText(img, text_buf, cvPoint(5,15), &myFont, cvScalar(0,0,255));
 

Понадобилось работать с камерами с разрешением 1280×960 и более. При работе через встроенную библиотеку OPenCV (DirectDraw) возникли определенные проблемы с быстродействием и капризность к камерам, часть тестовых камер HD вообще не заработали.

Решил попробовать работать с библиотекой videoInput которую можно взять здесь.

Но в комплекте исходники и собранные библиотеки под VC2005,VC2008,Dev-C++,CW. Под Mingw32 в комплекте нет.

Поиски в Google принесли результат: библиотека videoInput скомпилированная MinGW 4.4.0 DW2, спасибо Kronen, автору Qt-OpenCv лежит здесь.

Для работы с библиотекой под MinGW32 я поступил следующим образом:

  • заголовочный файл videoInput.h я поместил в:  c:\dev\OpenCV-2.2.0\3rdparty\videoInput\Include\
  • саму библиотеку для MinGW32 и все дополнительные библиотеки в: c:\dev\OpenCV-2.2.0\3rdparty\videoInput

Continue reading »

 

Сегодня будем скрещивать:

Все устанавливаемые библиотеки (кроме Qt)я держу в папке C:\dev это на ваш выбор.

Установка QtSDK.

Все делаем по умолчанию.

Установка CMake.

Никаких сложностей в себе не таит. Единственное не забыть включить добавление путей в переменную PATH.

Continue reading »

 

Простейший пример применение HaarClassifier в OpenCV.

#include
#include
#include

using namespace cv;

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

    Mat frame, gray;
    string face_cascade = "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml";
    CascadeClassifier haar(face_cascade);
    VideoCapture cap(0);
    namedWindow("Video", 1);
    vector objects;

    while (true) {
        cap >> frame;
        cvtColor(frame, gray, CV_BGR2GRAY);

        haar.detectMultiScale(gray, objects, 1.5, 16, 0, Size(32,32));
        for (vector::const_iterator r = objects.begin(); r != objects.end(); r++)
            rectangle(frame, r->tl(), r->br(), Scalar(0, 0, 255));

        imshow("Video", frame);

        if (waitKey(33) >= 0) break;
    }

    return (EXIT_SUCCESS);
}

Continue reading »

 

Хотел-бы поделиться функцией преобразования IplImage в QImage:

// Эта функция копирует IplImage 8бит, 3 канала в Qt QImage
// не выделяет новый размер для входного QImage
// Для неё нужно создать входной QImage нужного размера
int IplCopyToQImage(IplImage *img,QImage &qimg)
{
     if (!img) return 1;
     int minw = std::min(img->width,qimg.width());
     int minh = std::min(img->height,qimg.height());
     if (minw == 0 || minh == 0) return 2;
 
     for (int y = 0;y < minh;y++)
     {
          uchar *ptr = (uchar*)(img->imageData + y*img->widthStep);
          QRgb *ptrDst = (QRgb*)(qimg.scanLine(y));
 
          for (int x = 0;x<minw ;x++)
          {
               int b = ptr[3*x];
               int g = ptr[3*x+1];
               int r = ptr[3*x+2];
               *ptrDst=qRgb(r,g,b);// opt:: using scanline here
               ptrDst++;
          };
     };
 
     return 0;
}
 
// Эта функция сама пересоздаст нужных размеров QImage
int IplToQImage(IplImage *img,QImage &qimg)
{
     if (img == 0) return 1;
 
     int w = img->width;
     int h = img->height;
 
     qimg = QImage(img->width,img->height,QImage::Format_RGB32);
 
     return 1+IplCopyToQImage(img,qimg);
}

Continue reading »

 

В данной статье будет рассмотрена попытка установить OpenCV 2.2 с поддержкой IPP 6.1 update 6 на Ubuntu 10.

Все приводимые здесь действия производились на виртуальной машине работающей по Virtual box 4.0.4 со свежей установленной Ubuntu 10.

Подготавливаем среду для компиляции, устанавливаем все необходимые библиотеки и программы:

sudo -s
apt-get install build-essential cmake pkg-config libpng12-0 libpng12-dev libpng3
apt-get install libpnglite-dev libpngwriter0-dev libpngwriter0c2 zlib1g-dbg zlib1g zlib1g-dev
apt-get install libjasper-dev libjasper-runtime libjasper1
apt-get install pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
apt-get install libjpeg62 libjpeg62-dev libjpeg62-dbg libjpeg-progs
apt-get install ffmpeg libavcodec-dev libavcodec52 libavformat52 libavformat-dev
apt-get install libgstreamer0.10-0-dbg libgstreamer0.10-0  libgstreamer0.10-dev
apt-get install libxine1-ffmpeg  libxine-dev libxine1-bin
apt-get install libunicap2 libunicap2-dev libgstreamermm-0.10-dev
apt-get install libdc1394-22-dev libdc1394-22 libdc1394-utils libraw1394-11 libraw1394-dev
apt-get install swig libv4l-0 libv4l-dev python-numpy doxygen
apt-get install libgtk2.0-dev libtbb2 libtbb-dev libswscale-dev
exit

Continue reading »

© 2011 ADTL Blog Suffusion theme by Sayontan Sinha