среда, 22 июня 2011 г.

Вышла OpenCV 2.3.0r

Что нового:
+ Встроенная поддержка videoInput (теперь при сборке под Windows можно использовать ieee1934 камеры)
+ Раздельная документация для C, C++ и Python
+ Примеры работы под Android
+ Новый шаблон для калибровки камеры
+ Поддержка OpenNI для работы с сенсором kinect прямо из OpenCV

- Неисправный инсталлятор для VS2008 (приходится собирать вручную)

Полный список

пятница, 3 июня 2011 г.

Преобразование cv::Mat в QImage

Очень удобно при разработке приложений по техническому зрению с графическем интерфейсом использовать OpenCV и Qt.

Но у некоторых людей возникают проблемы конвертировать изображения cv::Mat в QImage.

Итак, это очень просто вот функция:

/* Параметры: image - изображение которое хотим превратить в QImage
qim - уже загруженный в память буфер под данные. Может быть равен нулю.
Возвращает новое преобразованное в QImage с копированием данных
*/
QImage* createQImage(cv::Mat image,QImage* qim)
{
    if(!image.data)
     return 0;
    cv::Mat color;
    //Если один канал у изображения
    if(1==image.channels())
    {
        //Делаем трехканальное изображение. К сожалению разработчики Qt не учли возможность
        //рисования серых изображений
        color.create(cv::Size(image.cols,image.rows),CV_8UC3);
        std::vector ls;
        ls.push_back(image);
        ls.push_back(image);
        ls.push_back(image);
        cv::merge(ls,color);
    }else{
        color = image;
    }
    QImage*  pImage=0;
    if(0==qim)
    {
        pImage = new QImage(color.cols,color.rows,QImage::Format_RGB888);
    }else{
        if((qim->width()==color.cols)&&(qim->height()==color.rows))
        {
            pImage = qim;
        }else{
            delete qim;
            pImage = new QImage(color.cols,color.rows,QImage::Format_RGB888);
        }
    }

    //
    IplImage im = (IplImage)color;
    //По неизвестным причинам pImage->bytesPerLine() и im.widthStep могут не совпадать
    if(pImage->bytesPerLine()!=im.widthStep)
    {
        //Копирование по строкам
        for(int i=0;iheight();i++)
        {
            memcpy(pImage->bits()+i*pImage->bytesPerLine(),color.data+im.widthStep*i,im.widthStep);
        }
    }else{
        //Копирование всего изображения
        memcpy(pImage->bits(),color.data,im.imageSize);
    }
    return pImage;
}

Вот и все. Надею кому-то будет полезно!