这几天一直在折腾给arm a9的开发板移植opencv,但是移植无法使用highgui部分。索性直接看源码,自己实现这部分界面显示的功能。结果看到了一些熟悉的东西,如下:
void DefaultViewPort::updateImage(const CvArr* arr)
{
CV_Assert(arr);
CvMat* mat, stub;
int origin = 0;
if (CV_IS_IMAGE_HDR(arr))
origin = ((IplImage*)arr)->origin;
mat = cvGetMat(arr, &stub);
if (!image2Draw_mat || !CV_ARE_SIZES_EQ(image2Draw_mat, mat))
{
if (image2Draw_mat)
cvReleaseMat(&image2Draw_mat);
//the image in ipl (to do a deep copy with cvCvtColor)
image2Draw_mat = cvCreateMat(mat->rows, mat->cols, CV_8UC3);
image2Draw_qt = QImage(image2Draw_mat->data.ptr, image2Draw_mat->cols, image2Draw_mat->rows, image2Draw_mat->step, QImage::Format_RGB888);
//use to compute mouse coordinate, I need to update the ratio here and in resizeEvent
ratioX = width() / float(image2Draw_mat->cols);
ratioY = height() / float(image2Draw_mat->rows);
updateGeometry();
}
nbChannelOriginImage = cvGetElemType(mat);
cvConvertImage(mat, image2Draw_mat, (origin != 0 ? CV_CVTIMG_FLIP : 0) + CV_CVTIMG_SWAP_RB);
viewport()->update();
}
这是opencv3.1.0中highgui模块中的window_QT.cpp的第2410行,可见,底层就是网上常见的
image2Draw_mat = cvCreateMat(mat->rows, mat->cols, CV_8UC3);
image2Draw_qt = QImage(image2Draw_mat->data.ptr, image2Draw_mat->cols, image2Draw_mat->rows, image2Draw_mat->step, QImage::Format_RGB888);
此外注意window_QT.cpp第1000,371,703行,window_QT.h第340,462行,window.cpp第277行。DefaultViewPort继承自QGraphicsView,paintEvent在window_QT.cpp第2710行,里面调用draw2D(在第2909行)来绘制图片。
因此可以放心大胆地用qt来显示opencv的图像了,而不必移植gtk2.0.