Показаны сообщения с ярлыком opencv. Показать все сообщения
Показаны сообщения с ярлыком opencv. Показать все сообщения

среда, 29 июля 2009 г.

В ubuntu 9.04 не работает cvCaptureFromFile, cvCaptureFromCAM...

А не работают эти функции потому opencv собран без поддержки ffmpeg. А произошло это потому что в убунте пакеты для разработки (*-dev) ffmpeg'а разбиты на несколько пакетов (libavformat-dev, libavcodec-dev, libavfilter-dev подробности...) которые ставятся в свои отдельные директории. По этому конфигурационный скрипт просто не находит ffmpeg в системе... но даже если скормить конфигу правильные пути, opencv всё равно собираться не будет (коммент).

Но, благодаря усилиям Gijs Molenaar, в его PPA появилась пропатченная версия opencv с поддержкой видео для ubuntu 9.04!
Устанавливаем так:
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com cafc44ee7f39098ce6ec229cca70e6a9087475a0
Далее в менеджере репозиториев добавляем:
deb http://ppa.launchpad.net/gijzelaar/opencv/ubuntu jaunty main
Потом просто обнавляем opencv в синаптике.

Ссылки


Баг на launchpad
Описание решения на английском

понедельник, 1 июня 2009 г.

Как преобразовать cvMat в QImage

Некоторые функции из библиотеки OpenCV используют вместо изображений (IplImage) матрицы (CvMat). Как мне кажется, сделано это из-за того, что такой подход больше приближен к математическим моделям и это упрощает реализацию. Но зато это усложняет использование :(

Сначала, для преобразования матриц в картинки, я использовал код с форума qtcentre. Но у него было целых два минуса: во-первых, он преобразовывает в QImage исключительно IplImage и мою матрицу надо было дополнительно преобразовывать; во-вторых, он просто не правильно работал (у получившегося изображения были не правильные размеры).

В общем, я сделал свою функцию преобразования с блекджеком и распутными девицами.

Ограничения: для чёрно-белых изображений (цветные тоже можно преобразовать, но они станут ч/б); данные должны храниться в строках (в каждой строке одна картинка).
// sz: img' resolution; idx: row index where image is stored (@img)
QImage cvMatToQImage(const CvMat *img, const CvSize sz, const size_t idx)
{
Q_ASSERT(CV_IS_MAT(img));
Q_ASSERT(img->rows > idx);
Q_ASSERT((sz.width*sz.height)==img->cols);
QImage t1(sz.width,sz.height,QImage::Format_RGB888);
const int type = CV_MAT_TYPE( img->type );
for (int i=0;i<sz.height;i++)
for(int j=0;j<sz.width;j++) {
int g=0;
switch(type) { // calculate size of single element
case CV_32FC1:
g = static_cast<int>(CV_MAT_ELEM(*img,float,idx,i*sz.width+j));
break;
case CV_8UC1:
g = static_cast<int>(CV_MAT_ELEM(*img,uchar,idx,i*sz.width+j));
break;
default:
qFatal("This is very sad T_T");
}
t1.setPixel(j,i,qRgb(g,g,g));
}
return t1;
}