通過C++ wrapper 實現存取圖像像素

#ifndef _OPENCV_H_
#define _OPENCV_H_

#include <opencv2/opencv.hpp>
//#include "opencv/cv.h"
//#include "opencv/highgui.h"

#ifdef _WIN32
#ifdef _DEBUG
//Debug   mode
#pragma comment(lib,"opencv_core231d.lib")
#pragma comment(lib,"opencv_highgui231d.lib")
#pragma comment(lib,"opencv_imgproc231d.lib")
#pragma comment(lib,"opencv_video231d.lib")
#pragma comment(lib,"opencv_ml231d.lib")
#pragma comment(lib,"opencv_legacy231d.lib")
#else
//Release   mode
#pragma comment(lib,"opencv_core231.lib")
#pragma comment(lib,"opencv_highgui231.lib")
#pragma comment(lib,"opencv_imgproc231.lib")
#pragma comment(lib,"opencv_video231.lib")
#pragma comment(lib,"opencv_ml231.lib")
#pragma comment(lib,"opencv_legacy231.lib")
#endif
#else
// other
#endif

template<class T> class Image
{
private:
    IplImage* imgp;
public:
    Image(IplImage* img = 0)
    {
        imgp = img;
    }

    ~Image()
    {
        imgp = 0;
    }

    void operator=(IplImage* img)
    {
        imgp = img;
    }

    inline T* operator[](const int rowIndx)
    {
        return ((T*)(imgp->imageData + rowIndx * imgp->widthStep));
    }
};

typedef struct {
    unsigned char b, g, r;
} RgbPixel;

typedef struct {
    float b, g, r;
} RgbPixelFloat;

typedef struct {
    double b, g, r;
} RgbPixelDouble;

typedef Image<RgbPixel>       RgbImage;
typedef Image<RgbPixelFloat>  RgbImageFloat;
typedef Image<RgbPixelDouble> RgbImageDouble;
typedef Image<unsigned char>  BwImage;
typedef Image<int>            BwImageInt;
typedef Image<float>          BwImageFloat;
typedef Image<double>         BwImageDouble;

#endif

例:對3通道的字節型圖像訪問如下:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
RgbImage imgA(img);
//假設訪問第K通道、第i行、第j列的像素
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;
int main(int argc, char** argv)
{
    IplImage* image, *grayImage, *binImage;
    image = cvLoadImage(argv[1]);

    grayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U,
                              1); // 1代表灰階圖
    CvSize Image2Size = cvSize(grayImage->width, grayImage->height);
    binImage = cvCreateImage(Image2Size, IPL_DEPTH_8U, 1);

    Mat element = getStructuringElement(1, Size(2, 2));

    if (!image || !grayImage) {
        printf("找不到檔案!!!");
    } else {
        //其實轉灰階有套數學公式,不過既然OpenCV已經有提供轉灰階的函數,就不需要使用到該公式了。
        cvCvtColor(image, grayImage, CV_RGB2GRAY);//RGB to Gray

        cvShowImage("gray image", grayImage);
        cvThreshold(grayImage, binImage, 106, 255,
                    CV_THRESH_BINARY); // 將灰階值在128以上設為255,以下則設為0


        cvShowImage("binImage image[+]", binImage);
        Closing(binImage);

        cv::Mat mat(binImage, 0);
        erode(mat, mat, element);
        cvShowImage("binImage image[-]", binImage);
        cvWaitKey(0);
    }

    return 0;
}