把每个OpenCV的地方改成CImg即可,下面是lena图的测试结果。
代码: canny.h
// // canny.h // Canny Edge Detector // // Created by Hasan Akgün on 21/03/14. // Copyright (c) 2014 Hasan Akgün. All rights reserved. // #ifndef _CANNY_ #define _CANNY_ #include "CImg.h" #include <vector> using namespace std; using namespace cimg_library; class canny { private: CImg<unsigned char> img; //Original Image CImg<unsigned char> grayscaled; // Grayscale CImg<unsigned char> gFiltered; // Gradient CImg<unsigned char> sFiltered; //Sobel Filtered CImg<unsigned char> angles; //Angle Map CImg<unsigned char> non; // Non-maxima supp. CImg<unsigned char> thres; //Double threshold and final public: canny(char[]); //Constructor CImg<unsigned char> toGrayScale(); vector<vector<double> > createFilter(int, int, double); //Creates a gaussian filter CImg<unsigned char> useFilter(CImg<unsigned char>, vector<vector<double> >); //Use some filter CImg<unsigned char> sobel(); //Sobel filtering CImg<unsigned char> nonMaxSupp(); //Non-maxima supp. CImg<unsigned char> threshold(CImg<unsigned char>, int, int); //Double threshold and finalize picture }; #endifcanny.cpp部分
canny::canny(char filename[]) { CImg<unsigned char> temp(filename); img = temp; if (0) // Check for invalid input { cout << "Could not open or find the image" << std::endl; } else { vector<vector<double> > filter = createFilter(3, 3, 1); //Print filter for (int i = 0; i<filter.size(); i++) { for (int j = 0; j<filter[i].size(); j++) { cout << filter[i][j] << " "; } } grayscaled = toGrayScale(); //Grayscale the image gFiltered = useFilter(grayscaled, filter); //Gaussian Filter sFiltered = sobel(); //Sobel Filter non = nonMaxSupp(); //Non-Maxima Suppression thres = threshold(non, 77, 95); //Double Threshold and Finalize 20 40 /***************way1 to display*******************/ CImgDisplay img_disp(img, "Original"), grayscaled_disp(grayscaled,"GrayScaled"), gFiltered_disp(gFiltered, "Gaussian Blur"), sFiltered_disp(sFiltered, "Sobel Filtered"), non_disp(non, "Non-Maxima Supp."), thres_disp(thres, "Final"); while (!img_disp.is_closed() || !grayscaled_disp.is_closed() || !gFiltered_disp.is_closed() || !sFiltered_disp.is_closed() || !non_disp.is_closed() || !thres_disp.is_closed()) { } /***************way2 to display*******************/ /*img.display("Original"); grayscaled.display("GrayScaled"); gFiltered.display("Gaussian Blur"); sFiltered.display("Sobel Filtered"); non.display("Non-Maxima Supp."); thres.display("Final");*/ } }这里是单单canny里面的改写,其他函数改动和这里差不多,大同小异,感觉自己改得有点蠢,就不全贴上来了。另外这里我用过两种display()的方式,个人喜好way1吧,各有各好处。
main.cpp
// // main.cpp // Canny Edge Detector // // Created by Hasan Akgün on 21/03/14. // Copyright (c) 2014 Hasan Akgün. All rights reserved. // #include <iostream> #define _USE_MATH_DEFINES #include <cmath> #include <vector> #include "CImg.h" #include "canny.h" #include "canny.cpp" using namespace cimg_library; using namespace std; int main() { char path[4][99] = {"stpietro.bmp", "bigben.bmp", "lena.bmp", "twows.bmp"}; //Filepath of input image for (int i = 0; i < 4; i++) { canny res(path[i]); } return 0; }canny算法具体实现我并没有细看,这次仅仅是改写表达方式而已,把OpenCV改成CImg库,通过这次改写,实际上不但对CImg有了更好的认识,并且对canny的实现步骤也有更深的印象。