话不多说,代码说明anything
#include<opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main(int argc, char* argv[]) { //加载图像 IplImage* src = cvLoadImage("e:\\kankan\\baihe.jpg"); /*//一般情况下 BGR2HSV 当使用的8位的图像时,转换后 H通道的取值范围是[0,180] IplImage* hsv = cvCreateImage(cvGetSize(src),8,3); IplImage* imgH = cvCreateImage(cvGetSize(src), 8 ,1); IplImage* imgS = cvCreateImage(cvGetSize(src), 8 , 1); IplImage* imgV = cvCreateImage(cvGetSize(src), 8 ,1); cvCvtColor(src,hsv , CV_BGR2HSV); */ //先将图像转换成float型的 此时 进行颜色空间转换后 H通道的取值范围才是[0,360] IplImage* floatsrc = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,3); IplImage* floathsv = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,3); IplImage* floatimgH = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F ,1); IplImage* floatimgS = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 1); IplImage* floatimgV = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F ,1); //将src从8位 转换到 32位的float型 cvConvertScale(src,floatsrc); //将float型图像 从BGR转换到HSV 如果需要转换到其他的颜色空间 那么改变CV_BGR2HSV即可 cvCvtColor(floatsrc,floathsv , CV_BGR2HSV); //将三通道图像 分解成3个单通道图像 cvSplit(floathsv , floatimgH, floatimgS,floatimgV ,NULL); //测试H通道的取值范围 int y, x; for( y=0;y<floatimgH->height;y++) { for( x =0 ;x<floatimgH->width;x++) { //获取单通道图像在(x,y)的值 float value = cvGetReal2D(floatimgH , y ,x); //测试H通道有没有大于180 if(value>180) { printf(" %f " , value); } } printf("\n"); } //释放相应的图像内存空间 cvReleaseImage(&src); cvReleaseImage(&floatsrc); cvReleaseImage(&floathsv); cvReleaseImage(&floatimgH); cvReleaseImage(&floatimgS); cvReleaseImage(&floatimgV); return 0; }