1. 对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法。然后将图像格式和矩阵运算,然后将各个算法的实现函数。
我用它来做了一个Harris角点检测器和Canny边缘检测器,总共就花了一个小时(第一次用OpenCV)。
而且该库显示图像极其方便,两句话就可以。
但该库似乎不大稳定,对32F和16S、8U的图像数据支持上bug重重。
我用cvFilter2D函数进行线性滤波,屡屡出错,后来一查原来是大bug。
后来用cvmGet来取矩阵元素也是频繁出错,仔细检查了N遍确保程序没问题之后在yahoogroup上找到答案:仍然是bug。。。
但好歹该库是开放的,所以自己可以修改;而且支持CVS。另外该库用的是IPL矩阵库,速度奇快~~
http://sourceforge.net/projects/opencvlibrary/
2. 对CxImage考察的印象:该开发包完全开放源代码,图像封装为一个类,功能极为强大,与Windows、MFC支持极好,支持图像的多种操作(线性滤波、中值滤波、直方图操作、旋转缩放、区域选取、阈值处理、膨胀腐蚀、alpha混合等等),支持从文件、内存或者win32api 定义的位图图像格式中读取图像,支持将图像显示在任意窗口,另外还有一个界面很强的demo,可以直接在上面进行二次开发,推荐使用!
缺点:里面的子库很多,用起来可能较麻烦;而且感觉速度稍慢,不如后面提到的freeimage,但功能真的十分强大啊!
3. CImg:就一个.h文件所以用起来很简明,但感觉功能上不如CxImage。
可以与CxImage配合使用,因为CImg提供了基于lapack的矩阵运算函数和完善的线性滤波卷积函数,同时CImg做像素运算还是很方便的。另外,独有Display类可以方便的实现各种显示,包括显示图像、打字、画线等等。还有,该库有个基于光流的多尺度图像配准例子,很好。
4. FreeImage:C语言的体系,大量使用指针运算速度可以保证,内含先进的多种插值算法。
另外独有的支持meta exif信息的读取。该库最大的特点就是比较简练,只把重点放在对各种格式图像的读取写入支持上,没有显示部分,实际编程的时候还是需要调用API函数进行显示。
http://freeimage.sourceforge.net/
本人使用过CxImage,的确是个很强大的图像库,对于Windows支持很好,可以直接嵌入MFC程序中。
比如,使用CxImage提取图片缩略图:
// 新文件名=原文件名+_pre后缀+原扩展名 char thumbpath[256] = {0}; strcpy(thumbpath, path.insert(path.rfind('.'), "_pre").c_str()); cout << "缩略图路径:" << thumbpath << endl; // 构造采样参数 unsigned int thumbWidth = 80, thumbHeight = 60; // 80x60 pixel CxImage *pXImage = new CxImage(); if (!pXImage->Load(filepath, CXIMAGE_FORMAT_JPG)) { LOG1(_T("打开文件失败! 提取缩略图%s失败!"), filepath); delete pXImage; return; } if (!pXImage->Resample(thumbWidth, thumbHeight, 1)) // 重新采样: 80x60 pixel { LOG1(_T("重新取样失败! 提取缩略图%s失败!"), filepath); delete pXImage; return; } if (!pXImage->Save(thumbpath, CXIMAGE_FORMAT_JPG)) { LOG1(_T("保存文件失败! 提取缩略图%s失败!"), filepath); delete pXImage; return; } cout << "缩略图保存为:" << thumbpath << endl; delete pXImage;
另外,CImg也是一个非常好的轻量级图像库,sf上有全套源码和例程,还有中文翻译的文档,在工程中只需要引用CImg.h,简洁方便,很适合初学者。
例程:
#include "CImg.h" using namespace cimg_library; int main() { // 定义一个每个颜色 8 位(bit)的 640x400 的彩色图像 CImg<unsigned char> img(640, 400, 1, 3); //将像素值设为 0(黑色) img.fill(0); // 定义一个紫色 unsigned char purple[] = { 255, 0, 255 }; // 在坐标(100, 100)处画一个紫色的“Hello world” img.draw_text(100, 100, "Hello World", purple); // 在一个标题为“My first CImg code”的窗口中显示这幅图像 img.display("My first CImg code"); return 0; }