天天看點

Cimg代碼初探

                                                      Cimg代碼初探

    程式設計最為激動人心的地方,在于豐富的并且容易被查閱到資料。比如對于圖像處理,固然有Opencv等較為豐富、被廣泛知曉的類庫;也有其他很多具有一定特色的類庫。在這段時間裡面,我對CImg圖像處理庫進行了初步研究,并且做小結如下:

一、類庫總體情況

    總體感覺,CImg是一個“小家碧玉”類型的類庫。這裡的“小”,不僅展現在代碼結構上、展現在代碼數量上,我覺得很大程度上也展現在代碼内容上:比如代碼的縮進都是采用最節省空間的方法,

Cimg代碼初探

大量采用了連續處理的方法,其實作的功能也是比較有“趣味”,但不是解決實際問題的方法

Cimg代碼初探

再比如,已經将許多圖檔程式以“寫死”的方式編入了類庫,這些都展現了程式設定者的“偏執”,或者叫做“個性”,但是并不能将CImg變成一個更有用的類庫。

Cimg代碼初探

但是反過來說,CImg實作的許多效果,的确是匠心獨運,簡直可以說是"so COOL"

Cimg代碼初探

炫動的菜單背景

Cimg代碼初探

非常适合做幫助的flag

Cimg代碼初探

光怪陸離的效果

Cimg代碼初探

遊戲

Cimg代碼初探

3D效果

Cimg代碼初探

魚眼

Cimg代碼初探

可視化的Gamma矯正

Cimg代碼初探

足球軌迹。

二、研究思路和計劃

    1)對前面提出來的幾個部分進行分别研究,并且分割複用其中部分為自己所用,關鍵是了解思路;

    2)将類庫中全部的檔案和其應該發揮的作用搞明白;

    3)登入官網,檢視了解這個類庫的發展、讨論和現狀;

    4)反思在圖像處理領域應該如何做下去。

[2016年4月7日15:34:25]

首先了解CImg類庫的類庫特點和代碼結構;而後對背景動畫進行分析。所有的結果都需要能夠獨立出來并且友善被複用。

Cimg代碼初探

        能夠直接繪制出"plasma"紋理的界面

        動态的圓的界面主要還是來自于随機數

#include "CImg_demo.h"

// Include CImg library header.

#include "CImg.h"

using namespace cimg_library;

#undef min

#undef max

void main()

{

     cimg::info();

     //各類RGB定值

     const unsigned char

         white[]  = { 255, 255, 255 }, black[] = { 0, 0, 0 },     red[] = { 120, 50, 80 },

         yellow[] = { 200, 155, 0 },   green[] = { 30, 200, 70 }, purple[] = { 175, 32, 186 },

         blue[]   = { 55, 140, 185 },  grey[] = { 127, 127, 127 };

     float

         rx = 0, ry = 0, t = 0, gamma = 0, vgamma = 0, T = 0.9f,

         nrx = (float)(2*cimg::crand()),

         nry = (float)(2*cimg::crand());

     int y0 = 2*13;

     //圖像顯示

     CImg<unsigned char> back(1,2,1,3,10), fore, text, img;//back fore text img都是界面背景

     back.fillC(0,1,0,10,10,235).resize(640,480,1,3,3).get_shared_channel(2).noise(10,1).draw_plasma();//綠寶石界面

      fore.assign(back.width(),50,1,1,0).draw_text(20,y0-5,"** CImg %u.%u.%u Samples **",grey,0,1,24,

     cimg_version/100,(cimg_version/10)%10,cimg_version%10);

     (fore+=fore.get_dilate(3).dilate(3)).resize(-100,-100,1,3);

     cimg_forXY(fore,x,y)

     if (fore(x,y)==127) fore(x,y,0) = fore(x,y,1) = fore(x,y,2) = 1;

     else if (fore(x,y)) {

     const float val = cimg::min(255.0f,7.0f*(y-3));

     fore(x,y,0) = (unsigned char)(val/1.5f);

     fore(x,y,1) = (unsigned char)val;

     fore(x,y,2) = (unsigned char)(val/1.1f);

     }

     fore.resize(back,0).draw_image(20,y0+2*13,text|=text.get_dilate(3)>>4);

     //建立顯示的窗體

     CImgDisplay disp(back,"CImg Library Samples",0,false,true);

     disp.move((disp.screen_width()-disp.window_width())/2,(disp.screen_height()-disp.window_height())/2);

     img = back; back*=0.15f;

      for (y0+=2*13; !disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC(); ) {

           while ( !disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {

                img*=0.85f; img+=back;

                for (int i = 0; i<60; ++i) {

                    const float

                        mx = (float)(img.width()/2+(img.width()/2-30)*((1-gamma)*std::cos(3*t+rx*i*18.0f*cimg::PI/180) +

                        gamma*std::cos(3*t+nrx*i*18.0f*cimg::PI/180))),

                        my = (float)(img.height()/2+(img.height()/2-30)*((1-gamma)*std::sin(4*t+ry*i*18.0f*cimg::PI/180) +

                        gamma*std::sin(4*t+nry*i*18.0f*cimg::PI/180))),

                        mz = (float)(1.3f + 1.2f*((1-gamma)*std::sin(2*t+(rx+ry)*i*20*cimg::PI/180) +

                        gamma*std::sin(2*t+(nrx+nry)*i*20*cimg::PI/180)));

                    const int j = i%5;

                    //具體畫圓

                    img.draw_circle((int)mx,(int)my,(int)(10*mz),j!=0?(j!=1?(j!=2?(j!=3?green:red):yellow):purple):blue,0.2f).

                        draw_circle((int)(mx+4*mz),(int)(my-4),(int)(3*mz),white,0.1f).

                        draw_circle((int)mx,(int)my,(int)(10*mz),black,0.2f,~0U);

                }

                const unsigned char *ptrs = fore.data();

                cimg_for(img,ptrd,unsigned char) 

                { 

                    const unsigned char val = *(ptrs++);

                    if (val) *ptrd = val; 

}

                //顯示菜單條

                int y = disp.mouse_y();

                if (y>=y0 && y<y0+27*13) {

                    y = (y/13)*13+7;

                    for (int yy = y-7; yy<=y+6; ++yy) img.draw_rectangle(0,yy,0,1,img.width()-1,yy,0,1,(unsigned char)(130-15*cimg::abs(yy-y)));

                    img.draw_triangle(2,y-4,2,y+4,8,y,yellow).draw_triangle(img.width()-2,y-4,img.width()-2,y+4,img.width()-8,y,yellow);

                gamma+=vgamma; 

                if (gamma>1) 

                    gamma = vgamma = 0; 

                    rx = nrx;

                    ry = nry; 

                    nrx=(float)(2*cimg::crand());

                    nry=(float)(2*cimg::crand());

                t+=0.006f; T+=0.005f; if (T>1) { T-=(float)(1+cimg::crand()); vgamma = 0.03f; }

                disp.resize(disp,false).display(img).wait(25);

           }

      }

     getchar();

使用opencv進行重寫

來自為知筆記(Wiz)

目前方向:圖像拼接融合、圖像識别

聯系方式:[email protected]

繼續閱讀