Dror Maydan and Steve Leibson, Tensilica
10/10/2006 9:00 AM EDT
Program developers of embedded processor cores within System-onChips (SoCs) want their code to run fast to lessen processor-operating frequency, consume little memory and reduce memory cost. Two key factors affecting the design team’s ability to meet such goals are the compiler’s code-optimizing efficiency and source-code programming styles.

Compilers consist of front and back-ends. The front-end is for syntactic and semantic processing. The back-end performs general optimizations, code generation and further optimization for specific target processor. Good back-ends rely on multilevel intermediate representations (IRs). Continue reading »

 

Язык C++ вслед за С позволяет писать функции с переменным числом параметров. Одним из простых примеров может служить функция, вычисляющая среднее арифметическое своих аргументов. Другой уже классический пример — функция сцепления произвольного количества строк, которая является естественным обобщением функции сцепления двух строк.
Переменный список параметров задается в заголовке функции многоточием:

int f()

Continue reading »

 

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

Рассмотрим в начале задачу, в которой программа ищет только один объект. Изображение состоит из множества отдельных частей, пикселей и наша задача сводится к нахождению массива пикселей одого цвета, в нашем случае зелёного. Будем считать, что зелёный пиксель это такой пикскль у которого зелёная составляющая его цвет (по 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 »

© 2011 ADTL Blog Suffusion theme by Sayontan Sinha