繼openCV之后接觸的又一個C++視覺庫——短小精干的CImg
剛開始接觸的時候真的是..幾乎無從下手,網上資料比較少,但發現有一篇非常有用的中文手冊:http://wenku.baidu.com/link?url=GKEgUZUzabHADgCQG3Dg5NGzaMevXu38vvHF71UB339zZJVLaqYWCrPQfmNV7Y0gYMb340wVNK9fJ7Zu0H54Hchi8UwKI3yCQlCnVcoC8mK
再加上,CImg本身的代碼並不是很多,也容易理解,最關鍵的是,源碼里注釋寫得很明白,所以打開源碼,ctrl+F來學習也非常不錯。
這里記錄一下CImg的一些基本的像素操作
————————————————我是一條分割線—————————————————————
主要是這幾個:
(x, y分別表示在橫縱軸上的坐標,(0,0)在左上角, z = 1時,表示2D圖像, c 表示通道數)
//存取(x, y)處,z通道的值, 若X小於0,則取值為零,若x大於width,則取值width-1處,最后存取(x, y, z, c)的值
T& atX(int x, int y, int z, int c)
//存取(x, y)處,z通道的值 ,防止X、Y超出范圍,若是超出范圍則取邊界值,最后存取(x, y, z, c)的值
T& atXY(int x, int y, intz, int c)
//存取(x, y)處,z通道的值 ,防止X、Y、Z超出范圍,同上
T& atXYZ(int x, int y, int z, int c)
//存取(x, y)處,z通道的值 ,防止X、Y、Z、C超出范圍, 同上
T& atXYZC(int x, int y, int z, int c)
//存取(x, y)處,z通道的值 , 若X超出范圍,則返回out_value
T& atX(int x, int y, int z, int c, const T& out_value)
//存取(x, y)處,z通道的值 , 若(X超出范圍 || y超出范圍),則返回out_value
T& atXY(int x, int y, intz, int c, const T& out_value)
//存取(x, y)處,z通道的值 ,若(X超出范圍 || y超出范圍 || z超出范圍),則返回out_value
T& atXYZ(int x, int y, int z, int c, const T& out_value)
//存取(x, y)處,z通道的值 ,若(X超出范圍 || y超出范圍 || Z超出范圍 || C超出范圍),則返回out_value
T& atXYZC(int x, int y, int z, int c, const T& out_value)
編譯指令:
g++ -o test.exe test.cpp -O2 -L/usr/X11R6/lib -lm -lpthread -lX11
運行:
./test.exe
code:

1 #include <iostream> 2 #include "CImg.h" 3 4 using namespace cimg_library; 5 using namespace std; 6 7 int main(int argc, char* argv[]) { 8 9 CImg<unsigned char> testImage1("images/image3.bmp"); 10 CImg<unsigned char> testImage2(testImage1.width(), testImage1.height(), 1, 3); 11 for (int i = 0; i < testImage1.width(); i ++) 12 for (int j = 0; j < testImage1.height(); j ++) 13 for (int k = 0; k < 3; k ++) 14 testImage2.atXYZC(i, j, 1, k) = testImage1.atXYZC(i, j, 1, k); 15 testImage2.display("COPY"); 16 return 0; 17 }