Что нового:
+ Встроенная поддержка videoInput (теперь при сборке под Windows можно использовать ieee1934 камеры)
+ Раздельная документация для C, C++ и Python
+ Примеры работы под Android
+ Новый шаблон для калибровки камеры
+ Поддержка OpenNI для работы с сенсором kinect прямо из OpenCV
- Неисправный инсталлятор для VS2008 (приходится собирать вручную)
Полный список
Данный блог - мои замечания касающиеся тем технического зрения. В данном блоге я буду выкладывать свои находки, инструкции и что у меня получилось.
среда, 22 июня 2011 г.
пятница, 3 июня 2011 г.
Преобразование cv::Mat в QImage
Очень удобно при разработке приложений по техническому зрению с графическем интерфейсом использовать OpenCV и Qt.
Но у некоторых людей возникают проблемы конвертировать изображения cv::Mat в QImage.
Итак, это очень просто вот функция:
Вот и все. Надею кому-то будет полезно!
Но у некоторых людей возникают проблемы конвертировать изображения 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;
}
Вот и все. Надею кому-то будет полезно!
Подписаться на:
Комментарии (Atom)