您的当前位置:首页正文

C++图像库

2022-09-05 来源:客趣旅游网
C++图像库

1. 对OpenCV 的印象:功能⼗分的强⼤,⽽且⽀持⽬前先进的图像处理技术,体系⼗分完善,操作⼿册很详细,⼿册⾸先给⼤家补计算机视觉的知识,⼏乎涵盖了近10年内的主流算法。然后将图像格式和矩阵运算,然后将各个算法的实现函数。

我⽤它来做了⼀个Harris⾓点检测器和Canny边缘检测器,总共就花了⼀个⼩时(第⼀次⽤OpenCV)。 ⽽且该库显⽰图像极其⽅便,两句话就可以。

但该库似乎不⼤稳定,对32F和16S、8U的图像数据⽀持上bug重重。 我⽤cvFilter2D函数进⾏线性滤波,屡屡出错,后来⼀查原来是⼤bug。

后来⽤cvmGet来取矩阵元素也是频繁出错,仔细检查了N遍确保程序没问题之后在yahoogroup上找到答案:仍然是bug。。。 但好⽍该库是开放的,所以⾃⼰可以修改;⽽且⽀持CVS。另外该库⽤的是IPL矩阵库,速度奇快~~

2. 对CxImage考察的印象:该开发包完全开放源代码,图像封装为⼀个类,功能极为强⼤,与Windows、MFC⽀持极好,⽀持图像的多种操作(线性滤波、中值滤波、直⽅图操作、旋转缩放、区域选取、阈值处理、膨胀腐蚀、alpha混合等等),⽀持从⽂件、内存或者

win32api 定义的位图图像格式中读取图像,⽀持将图像显⽰在任意窗⼝,另外还有⼀个界⾯很强的demo,可以直接在上⾯进⾏⼆次开发,推荐使⽤!

缺点:⾥⾯的⼦库很多,⽤起来可能较⿇烦;⽽且感觉速度稍慢,不如后⾯提到的freeimage,但功能真的⼗分强⼤啊!3. CImg:就⼀个.h⽂件所以⽤起来很简明,但感觉功能上不如CxImage。

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

4. FreeImage:C语⾔的体系,⼤量使⽤指针运算速度可以保证,内含先进的多种插值算法。

另外独有的⽀持meta exif信息的读取。该库最⼤的特点就是⽐较简练,只把重点放在对各种格式图像的读取写⼊⽀持上,没有显⽰部分,实际编程的时候还是需要调⽤API函数进⾏显⽰。

本⼈使⽤过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 pixelCxImage *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 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\

// 在⼀个标题为“My first CImg code”的窗⼝中显⽰这幅图像 img.display(\"My first CImg code\");

return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容