opencv有直接提取图像色度.饱和度.亮度的函数吗

opencv有直接提取图像色度.饱和度.亮度的函数吗,第1张

1先调用cvCvtColor将图像转到HSV颜色空间,如:cvCvtColo(rgb,hsv,CV_BGR2HSV);然后调用cvSplit函数,就可以将H分量分离出来,再来单独访问H分量,H对于的通道是0即可。

2HSV(Hue,Saturation,Value)是根据颜色的直观特性由ARSmith在1978年创建的一种颜色空间,也称六角锥体模型(HexconeModel)。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

       开发slam过程中,希望使用笔记本自带的摄像头跑slam算法,但是因为虚拟机支持不够会出现各种问题。先介绍一下我的环境:VmWare12 + Ubuntu 14 + ROS Indigo +  OpenCV331。碰到的问题:

           1)使用ros支持包usb_cam,发布数据时,必须设置format为"mjpeg"格式,可参照我之前的文章—— 《SLAM--虚拟机环境下的相机标定》 ,我在相机标定时先把虚拟机的usb设置为11,然后把usb_cam-testlaunch中的format改为"mjpeg",才可以读取数据,但是运行launch文件一直提示格式无法转,其实这个还是因为图像没有正确读取的,而且百度上都说改为usb30,所以我怀疑这种方式不是正确的,果真出现第二个问题,如下;

            2)使用opencv中videoCapture类读取图像数据时,运行时摄像头灯是打开的,但是就是imshow不出图像,试了各种办法,诸如延迟、更改usb设置啊等等,但是均不能解决。

         经过几天的纠结开始怀疑是不是虚拟机对usb支持的不够好,毕竟这个很多人也是诟病的。然后就把虚拟机卸载,重新安装vmware14,因为是高版本支持之前的ubuntu虚拟机系统,打开虚拟机后在主页面会有“升级此虚拟机”,出现“硬件兼容性”,选择Workstation14x,然后点击下一步,两个选择,可以克隆作备份或者直接升级。

         事实上并没有解决上述问题,之后我怀疑是不是摄像头驱动应该更新一下,然后就卸载再重新安装了驱动,事实上驱动应该还是原来的驱动。但是奇迹发生了,重新再运行虚拟机后,将usb改为30可以正常读取数据了,格式为“YUYV”也可以,opencv也可以正常读取数据。

        个人觉得还是跟虚拟机支持硬件的兼容性有关。希望对大家有用! 

OpenCV的话:

YUV->IplImage->缩放->转换回YUV

可参考:YUV转IPLImage(RGB)

或者使用ffmpeg的swscale可以直接实现

可参考:FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

Opencv显示RGB图像出现绿色竖线,且同时对应YUV图像也出现竖线,是因为 前后图像位数不同导致的内存拷贝错误,原16位像素数据现在需要两个8位像素来存储,使得图像在横向上隔一个数据出现一次

1、可以变成灰度图也可以不变。这里假设你的图像都是IPL_DEPTH_8U类型。

2、如果变成灰度图,就是单通道图像,获取的就是每一个像素点的灰度值。

IplImage img = cvLoadImage("testbmp", 0);

for (int i = 0; i < img->height; i++)

{

for (int j = 0; j < img->width; j++)

{

//方法一:使用cvGet2D()函数间接访问

CvScalar s = cvGet2D(img, i, j); //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。

printf("gray value=%f\n",sval[0]);

//方法二:使用直接访问

uchar val = ((uchar )(img->imageData + iimg->widthStep))[j]; //i和j的意义同上

printf("gray value=%d\n",val);

}

}

3、如果不变成灰度图,就是3通道图像,获取的就是每一个像素点的BGR值,然后分别获取B值,G值和R值。

IplImage img = cvLoadImage("testbmp", 1);

for (int i = 0; i < img->height; i++)

{

for (int j = 0; j < img->width; j++)

{

//方法一:使用cvGet2D()函数间接访问

CvScalar s=cvGet2D(img,i,j); //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。

printf("B=%f, G=%f, R=%f\n",sval[0],sval[1],sval[2]); //注意是BGR顺序

//方法二:使用直接访问

int bVal = ((uchar )(img->imageData + iimg->widthStep))[jimg->nChannels + 0]; // B

int gVal = ((uchar )(img->imageData + iimg->widthStep))[jimg->nChannels + 1]; // G

int rVal = ((uchar )(img->imageData + iimg->widthStep))[jimg->nChannels + 2]; // R

printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal); //注意是BGR顺序

}

}

以上就是关于opencv有直接提取图像色度.饱和度.亮度的函数吗全部的内容,包括:opencv有直接提取图像色度.饱和度.亮度的函数吗、SLAM--虚拟机Ubuntu下使用opencv读取摄像头数据、opencv怎么缩放yuv420等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9725695.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存