一. 所需结构体
CvScalar
结构体介绍
typedef struct CvScalar { double val[4]; //BGRA}CvScalar;
二. 所需函数
cvGet2D
函数功能:获取像素点上的RGB颜色分量,如果是灰度图直接返回灰度图颜色分量
函数原型:
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
参数介绍:
const CvArr* arr:要获取像素点颜色分量的图像指针
int idx0: 对应第几行
int idx1: 对应第几列
返回值:将获取到的像素点值以BGR的顺序返回到CvScalar结构体的val元素中,如果是灰度图那么val第一个元素就是灰度图的颜色分量
三. 开始编写代码
实验图:
jpg格式
3.1 打开一张图片
//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");if (image == NULL){//open image errorprintf("打开图像文件失败!");return -1;}
获取像素点颜色RGB颜色分量
CvScalar scalar;//scalarfor (int i = 0; i <= image->height-1; ++i){for (int j = 0; j <= image->width-1; ++j){scalar = cvGet2D(image,i,j);//获取像素点的RGB颜色分量printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);getchar();//防止打印速度太快,暂停一次打印一次}}
运行结果:
完整代码:
//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");if (image == NULL){//open image errorprintf("打开图像文件失败!");return -1;}CvScalar scalar;//scalarfor (int i = 0; i <= image->height-1; ++i){for (int j = 0; j <= image->width-1; ++j){scalar = cvGet2D(image,i,j);//获取像素点的RGB颜色分量printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);getchar();//防止打印速度太快,暂停一次打印一次}}
HSV通道:
需要cvCvtColor函数,我们只需要复用一下上面的代码即可
注意HSV颜色空间没有顺序问题,而RGB颜色空间Opencv使用的是BGR!
//加载图像到内存IplImage *image = cvLoadImage("D:\\1.jpg");if (image == NULL){//open image errorprintf("打开图像文件失败!");return -1;}IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels); //注意图像必须和输入图像的size,颜色位深度,通道一致cvZero(image1); //清空image_data数据 cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV CvScalar scalar;//scalarfor (int i = 0; i <= image1->height-1; ++i){//HSVfor (int j = 0; j <= image1->width-1; ++j){scalar = cvGet2D(image1, i, j);//获取像素点的RGB颜色分量printf("第%d个像素的H:%d°,S:%lf,V:%lf\n", (i*image->width) + j, (int)scalar.val[0]*2, scalar.val[1]/255, scalar.val[2]/255);getchar();//防止打印速度太快,暂停一次打印一次}}
运行结果: