把每个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
};
#endif
canny.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的实现步骤也有更深的印象。