OpenCV之Mat类

来源:互联网 发布:互刷流量软件 编辑:程序博客网 时间:2024/05/21 07:00

</pre><p></p><p>Mat类其实是OpenCV中的一个二维数组,用于存储图像,它有很多格式,不同的格式有不同的读取方法。</p><p>常见的是CV_8UC3,也就是3通道的像素值范围为(0-255)的图像,一般而言读入的jpeg,bmp都是这种图像。(默认读入的三通道排列顺序为BGR)</p><p></p><p>对于无符号精度图像,主要有8位,和16位两种,每种对应1-4不同的通道个数。(C(channel)之后的数字就代表通道个数)</p><p>8位:    <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">CV_8UC1,</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">CV_8UC2,</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">CV_8UC3,</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">CV_8UC4</span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">16位:<span style="word-wrap: normal; word-break: normal;">CV_16UC1,</span><span style="word-wrap: normal; word-break: normal;">CV_16UC2,</span><span style="word-wrap: normal; word-break: normal;">CV_16UC3,</span><span style="word-wrap: normal; word-break: normal;">CV_16UC4</span></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;"></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">同时,还有Float、double类型的图像:</span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">Float: CV_32FC1,<span style="font-family: simsun; font-size: 14px; line-height: 21px;">CV_32FC2,<span style="font-family: simsun; font-size: 14px; line-height: 21px;">CV_32FC3,<span style="font-family: simsun; font-size: 14px; line-height: 21px;">CV_32FC4</span></span></span></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;"><span style="word-wrap: normal; word-break: normal;"><span style="word-wrap: normal; word-break: normal;">Double:<span style="word-wrap: normal; word-break: normal;">CV_64FC1,</span><span style="word-wrap: normal; word-break: normal;">CV_64FC2,</span><span style="word-wrap: normal; word-break: normal;">CV_64FC3,</span><span style="word-wrap: normal; word-break: normal;">CV_64FC4</span></span></span></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;"></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">图像的读取方法有很多种,这里只根据这几种类型来讲一下:</span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;"></span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;">对于无符号精度图,单通道的用at<uchar> 可以获取,如:</span></p><p><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: simsun; font-size: 14px;"></span></p><pre name="code" class="cpp"><pre name="code" class="cpp"> pixel = outImage.at<uchar>(i, j);

对于3通道的无符号精度图的读取,如下:

B_u=img.at<Vec3b>(i, j)[0];G_u=img.at<Vec3b>(i, j)[1];R_u=img.at<Vec3b>(i, j)[2];

对于单通道的float类型,代码如下:

 pixel = outImage.at<float>(i, j);


对于3通道的float类型(CV_32FC3)采用如下代码:

                        imgCIE.at<Vec3f>(i,j)[0]=X;imgCIE.at<Vec3f>(i,j)[1]=Y;imgCIE.at<Vec3f>(i,j)[2]=Z;





当我们给Mat类的对象赋值的时候,如果有越界的话,就会减掉最大值,直到不越界。

比如,一个类型为CV_8U的Mat 对象,我们对某一个值赋为279,超过了最大值255,存储的时候,会存为24(279-255)。

因此,判断越界信息以及选对Mat类的格式很重要。



imshow函数使得Mat类中存储的图像信息以RGB的形式显示出来,哪怕你mat类中存储的不是rgb格式的图像,比如hsv,hls,CIE等,都会以rgb的形式显示。


0 0
原创粉丝点击