1. Produktai
  2.   Vaizdas
  3.   C++
  4.   CImg
 
  

Atvirojo kodo C++ biblioteka vaizdo apdorojimui

Taikykite vaizdo filtrus, kurkite, manipuliuokite ir atvaizduokite populiarių vaizdų failų formatus naudodami nemokamą C++ API.

CImg Library yra atvirojo kodo biblioteka, teikianti naudingų funkcijų, skirtų įkelti, išsaugoti, rodyti ir apdoroti įvairių tipų vaizdus C++ programose. CImg yra labai lengva ir patogi biblioteka. Geras dalykas yra tai, kad išvengiama sudėtingų priklausomybių ir bibliotekos suderinamumo problemų. Jis sudarytas iš vienos antraštės failo CImg.h, kuris turi būti įtrauktas į jūsų C++ šaltinį. Tai padeda kūrėjams atlikti sudėtingą vaizdo apdorojimo veiklą vos keliomis kodo eilutėmis.

API palaiko pažangias funkcijas, tokias kaip 3D vaizdų tvarkymas, vaizdų transformavimas, vaizdų filtravimas, vaizdų animacija, vaizdo dvejinimas ir kt. CImg biblioteka yra labai nešiojama ir savarankiška. Jis gali būti lengvai naudojamas įvairiose operacinėse sistemose. Be to, jis taip pat labai suderinamas su daugeliu C++ kompiliatorių, pvz., Visual C++, ICC, G++ ir kt.

Previous Next

Darbo su CImg pradžia

CImg biblioteką galima įsigyti kaip .zip paketą, kuris nepriklauso nuo platformos. Jame yra visi reikalingi failai ir įvairūs pavyzdžiai, kurie parodo, kaip naudotis bibliotekos funkcijomis ir klasėmis.

Turite pridėti šias dvi eilutes į savo C++ šaltinio kodą, kad galėtumėte dirbti su CImg.

Pridėkite šias eilutes, kad CImg veiktų

 #include "CImg.h" 
using namespace cimg_library 

Gaukite naujausią CImg versiją per Git

git clone --depth=1 https://github.com/GreycLab/CImg.git

C++ API vaizdams kurti ir modifikuoti

CImg atvirojo kodo biblioteka leidžia C++ kūrėjams kurti ir valdyti įvairių tipų vaizdus savo programose. Tai taip pat palaiko vaizdo rodymo ir pelės įvykių valdymą. Visų pirma, turite įtraukti pagrindinius ir vienintelius CImg bibliotekos antraštės failus. Geras dalykas yra tai, kad biblioteka sumažina kūrėjo apkrovą leisdama jiems parašyti labai nedidelį kodo kiekį. Taip pat atkreipkite dėmesį, kad šaltinis puikiai veiks UNIX ir Windows sistemose.

Sukurkite vaizdą naudodami C++ biblioteką

 #include "CImg.h"
using namespace cimg_library;
int main() {
  CImg image("lena.jpg"), visu(500,400,1,3,0);
  const unsigned char red[] = { 255,0,0 }, green[] = { 0,255,0 }, blue[] = { 0,0,255 };
  image.blur(2.5);
  CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
  while (!main_disp.is_closed() && !draw_disp.is_closed()) {
    main_disp.wait();
    if (main_disp.button() && main_disp.mouse_y()>=0) {
      const int y = main_disp.mouse_y();
      visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.width()-1,y,0,0),red,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,1,image.width()-1,y,0,1),green,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,2,image.width()-1,y,0,2),blue,1,1,0,255,0).display(draw_disp);
      }
    }
  return 0;
}

Vaizdo filtravimo palaikymas

CImg biblioteka palaiko vaizdų filtravimo procesą. Kartais mums reikia gauti informaciją apie vaizdus ir čia dažniausiai naudojamas vaizdų filtravimas. Vaizdo filtravimo procesas yra vienas iš labiausiai paplitusių metodų, taikomų vaizdams norint gauti informaciją. Dažniausiai filtrai naudojami vaizdo triukšmo šalinimui, kompiuterinio vaizdo dariniams, vaizdo briaunų pagerinimui, formų analizei ir kt.

Taikykite Furjė filtravimą C++ programose

 void* item_fourier_filtering() {
  const CImg img = CImg(data_milla,211,242,1,3).RGBtoYCbCr().channel(0).resize(256,256);
  CImgList F = img.get_FFT();
  cimglist_apply(F,shift)(img.width()/2,img.height()/2,0,0,2);
  const CImg mag = ((F[0].get_pow(2) + F[1].get_pow(2)).sqrt() + 1).log().normalize(0,255);
  CImgList visu(img,mag);
  CImgDisplay disp(visu,"[#16] - Fourier Filtering (Click to set filter)");
  CImg mask(img.width(),img.height(),1,1,1);
  const unsigned char one[] = { 1 }, zero[] = { 0 }, white[] = { 255 };
  int rmin = 0, rmax = 256;
  while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
    disp.wait();
    const int
      xm = disp.mouse_x()*2*img.width()/disp.width() - img.width(),
      ym = disp.mouse_y()*img.height()/disp.height(),
      x = xm - img.width()/2,
      y = ym - img.height()/2;
    if (disp.button() && xm>=0 && ym>=0) {
      const int r = (int)std::max(0.0f,(float)std::sqrt((float)x*x + y*y) - 3);
      if (disp.button()&1) rmax = r;
      if (disp.button()&2) rmin = r;
      if (rmin>=rmax) rmin = std::max(rmax - 1,0);
      mask.fill(0).draw_circle(mag.width()/2,mag.height()/2,rmax,one).
        draw_circle(mag.width()/2,mag.height()/2,rmin,zero);
      CImgList nF(F);
      cimglist_for(F,l) nF[l].mul(mask).shift(-img.width()/2,-img.height()/2,0,0,2);
      visu[0] = nF.FFT(true)[0].normalize(0,255);
    }
    if (disp.is_resized()) disp.resize(disp.window_width(),disp.window_width()/2).display(visu);
    visu[1] = mag.get_mul(mask).draw_text(5,5,"Freq Min/Max = %d / %d",white,zero,0.6f,13,(int)rmin,(int)rmax);
    visu.display(disp);
  }
  return 0;
}
 Lietuvių