1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

时间:2021-04-16 05:00:52

相关推荐

使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

一. 所需结构体

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();//防止打印速度太快,暂停一次打印一次}}

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。