OpenCV一个窗口画多个图

来源:互联网 发布:arcgis js v44 api 编辑:程序博客网 时间:2024/05/16 10:18

MatLab中subplot可以实现同一个窗口内画多个图,非常方便,尤其是在用于对比观察图像时更是如此,然而,OpenCV中没有封装这样的功能。于是自己实现了一个类似的,当然功能没有MatLab中的subplot那样强大。

算法的关键是对IplImage中ROI(Regions Of Interest)的理解
先看官方文档中的解释http://docs.opencv.org/2.4.9/modules/core/doc/old_basic_structures.html#IplROI* roi

IplROI* roiRegion Of Interest (ROI). If not NULL, only this image region will be processed.

换言之,只要我们设置ROI,再将若干个小图粘到大图上就可以了。

算法的主要思想是先遍历所有的小图,得到最大的宽度和高度,以此确定大图的尺寸,然后再按照设置的行数和列数往上面贴图就可以了

void showMultiImages(char *name, int row, int col, int nImgs, ...)    {        if (row*col < nImgs)        {            cout << "Wrong parameters for showing multi images" << endl;            return;        }        IplImage* eachImage;        int width = 0, height = 0;        va_list args;        va_start(args, nImgs);        for (int i = 0; i < nImgs; i++)        {            eachImage = va_arg(args, IplImage*);            ((eachImage->width)>width) ? (width = (eachImage->width)) : width = width;            ((eachImage->height) > height) ? (height = (eachImage->height)) : height = height;        }        va_end(args);        //va_list arg2;        va_start(args, nImgs);        int gap = 10;//图像间隙        IplImage *img;        img = cvCreateImage(cvSize(col*width + (col + 1)*gap, row*height + (row + 1)*gap), IPL_DEPTH_8U, 1);        cvZero(img);        CvPoint basePoint = cvPoint(gap, gap);        CvPoint ltPos = basePoint;        for (int i = 0; i < nImgs; i++)        {            if ((i%col == 0) && ltPos.x != basePoint.x)            {                ltPos.x = basePoint.x;                ltPos.y += (gap + height);            }            eachImage = va_arg(args, IplImage*);            cvSetImageROI(img, cvRect(ltPos.x, ltPos.y, eachImage->width, eachImage->height));            cvResize(eachImage, img);            cvResetImageROI(img);            ltPos.x += (gap + width);        }        va_end(args);        showOneImage(name, img);    }

效果
demo

0 0