edwardcmh

人氣不過肥皂泡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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,但功能真的十分强大啊!

http://www.xdp.it/cximage.htm

3. CImg:就一个.h文件所以用起来很简明,但感觉功能上不如CxImage。

可以与CxImage配合使用,因为CImg提供了基于lapack的矩阵运算函数和完善的线性滤波卷积函数,同时CImg做像素运算还是很方便的。另外,独有Display类可以方便的实现各种显示,包括显示图像、打字、画线等等。还有,该库有个基于光流的多尺度图像配准例子,很好。

http://cimg.sourceforge.net/

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; 
}
posted on 2012-05-10 10:52  edwardcmh  阅读(3261)  评论(0编辑  收藏  举报