好久没更新blog里,看到OpenCV官网做的越来越好,心里也是很高兴的,真有些冲动将来加入到这个组织里做些事。估计2.4.3要在国庆左右跟大家见面,让我们多期待一下吧。
闲话少说,今天不介绍复杂的算法了,来个简单的,大家写文章做图经常用Matlab,在Matlab里经常在一个窗口里打开多幅图片。遗憾的是OpenCV没有集成这样的功能,但这难不倒大家,让我试试用ROI来解决这个问题。
没啥好讲的,上代码好了:
1void imshowMany(const std::string& _winName, const vector<Mat>& _imgs) 2{ 3 int nImg = (int)_imgs.size(); 4 5 Mat dispImg; 6 int size; 7 int x, y; 8 // w - Maximum number of images in a row 9 // h - Maximum number of images in a column 10 int w, h; 11 // scale - How much we have to resize the image 12 float scale; 13 int max; 14 if (nImg <= 0) 15 { 16 printf("Number of arguments too small....\n"); 17 return; 18 } 19 else if (nImg > 12) 20 { 21 printf("Number of arguments too large....\n"); 22 return; 23 } 24 25 else if (nImg == 1) 26 { 27 w = h = 1; 28 size = 300; 29 } 30 else if (nImg == 2) 31 { 32 w = 2; h = 1; 33 size = 300; 34 } 35 else if (nImg == 3 || nImg == 4) 36 { 37 w = 2; h = 2; 38 size = 300; 39 } 40 else if (nImg == 5 || nImg == 6) 41 { 42 w = 3; h = 2; 43 size = 200; 44 } 45 else if (nImg == 7 || nImg == 8) 46 { 47 w = 4; h = 2; 48 size = 200; 49 } 50 else 51 { 52 w = 4; h = 3; 53 size = 150; 54 } 55 dispImg.create(Size(100 + size*w, 60 + size*h), CV_8UC3); 56 for (int i= 0, m=20, n=20; i<nImg; i++, m+=(20+size)) 57 { 58 x = _imgs[i].cols; 59 y = _imgs[i].rows; 60 max = (x > y)? x: y; 61 scale = (float) ( (float) max / size ); 62 if (i%w==0 && m!=20) 63 { 64 m = 20; 65 n += 20+size; 66 } 67 Mat imgROI = dispImg(Rect(m, n, (int)(x/scale), (int)(y/scale))); 68 resize(_imgs[i], imgROI, Size((int)(x/scale), (int)(y/scale))); 69 } 70 namedWindow(_winName); 71 imshow(_winName, dispImg); 72}
附上效果图一张:

工程的下载链接为http://download.csdn.net/detail/yang_xian521/4531610