//检测RGB区域代码
#include "cv.h"
#include "highgui.h"
#include <math.h>
#include <string.h>
#include <iostream>
IplImage* img =NULL;
IplImage* img0 =NULL;
IplImage* pic = NULL;
CvMemStorage* storage =NULL;
const char * wndname = "RGB检测 Demo";
char* names[] = { "pic16.png", "pic10.png","pic11.png","pic13.png","pic15.png",0};
void findRGB(IplImage *img,IplImage *pic)
{
for(int x=0;x<img->height;x++)
{
for(int y=0;y<img->width;y++)
{
if( ((uchar*)(img->imageData+x*img->widthStep))[y*img->nChannels+0]<30 //b
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 1]<30 //g
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 2]>150) //r
CV_IMAGE_ELEM(pic,uchar,x,y)=255;
if (((uchar*)(img->imageData+x*img->widthStep))[y*img->nChannels+0]<30 //b
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 1]>150 //g
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 2]<30) //r
CV_IMAGE_ELEM(pic,uchar,x,y)=255;
if (((uchar*)(img->imageData+x*img->widthStep))[y*img->nChannels+0]>150 //b
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 1]<30 //g
&&((uchar*)(img->imageData + x*img->widthStep))[y*img->nChannels + 2]<30) //r
CV_IMAGE_ELEM(pic,uchar,x,y)=255;
}
}
}
//cvFindContours( pic, storage, &contour, sizeof(CvContour),
//CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
//cvDrawContours(pic, contour,
// CV_RGB(180,0,0), CV_RGB(0, 0, 0),
// 2, 2, 8);
int main(int argc, char** argv)
{
int i, c;
for( i = 0; names[i] != 0; i++ )
{
img0 = cvLoadImage( names[i], 1 );
if( !img0 )
{
cout<<"不能载入"<<names[i]<<"继续下一张图片"<<endl;
continue;
}
img = cvCloneImage( img0 );
IplImage* pic=cvCreateImage( cvSize(img->width,img->height),8,1 );
cvNamedWindow( wndname, 1 );
cvShowImage(wndname,img);
findRGB(img,pic);
cvNamedWindow("findRGB",1);
cvShowImage("findRGB",pic);
c = cvWaitKey(0);
cvReleaseImage( &img );
cvReleaseImage( &img0 );
cvReleaseImage(&pic);
if( (char)c == 27 )
break;
}
cvDestroyWindow( "wndname" );
cvDestroyWindow("findRGB");
return 0;
}