由opencv with qt的imshow源码的一部分联想到在arm上实现highgui

来源:互联网 发布:置信度传播算法 编辑:程序博客网 时间:2024/05/31 18:37

这几天一直在折腾给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.


原创粉丝点击