понедельник, 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;
}

Комментариев нет:

Отправить комментарий