参见JILY博客的数字图像处理。
#include "stdafx.h" #include "iostream" #include "opencv/cv.h" #include "opencv/highgui.h" using namespace std; //int His[his]; void Convert256toGray(const CvArr * srcarr, CvArr *dstarr); int main() { IplImage *srcarr = NULL; IplImage *dstarr = NULL; srcarr = cvLoadImage("E:\\c++\\OPENCV_1\\lena.jpg", 1); dstarr = cvCreateImage( cvSize( srcarr->width, srcarr->height ), srcarr->depth, srcarr->nChannels ); Convert256toGray( srcarr, dstarr ); // cvCvtColor( srcarr, dstarr, CV_RGBA2GRAY ); cvNamedWindow("Exmple", CV_WINDOW_AUTOSIZE); cvShowImage("Exmple", dstarr); cvWaitKey(0); cvReleaseImage(&srcarr); cvReleaseImage(&dstarr); cvDestroyWindow("Exmple"); cin.get(); cin.get(); return 0; } void Convert256toGray(const CvArr * srcarr, CvArr *dstarr) { CvMat sstub, *src = cvGetMat( srcarr, &sstub ); CvMat dstub, *dst = cvGetMat( dstarr, &dstub ); CvSize size = cvGetSize(src); for ( int y = 0; y < size.height; y++ ) { uchar* sptr = src->data.ptr + src->step*y; uchar *Dataout = dst->data.ptr + dst->step*y; for ( int x = 0; x < size.width; x++, Dataout+=3, sptr+=3) { Dataout[1] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100; Dataout[2] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100; Dataout[3] = ( sptr[1] * 30 + sptr[2] * 59 + sptr[3] * 11 ) / 100; } } }