opencv中的uint8、int

opencv中的灰度图以uint8存储,3通道彩色图也是uint8,范围就是0~255

为什么要这样?

首先,像素值一般就是0到255,然后如果是int型,int一般是32位的,相当于浪费了接近24位,这样存储肯定是节约内存的

然后你用int()对uint8,uint16进行强制类型转换,实际上是不会损失的,因为你一个32位的对低位的进行类型转换肯定是不会损失的,只有高位转低位才会损失

1.image.at中uchar对应uint8,short对应uint16

2.做了一个实验,stixelImg.at<uchar>(1,1) = 255,在1,1这个位置,stixelImg会将原本是int型的255转换成uint8型,即uchar

3.如果在1,1那个位置存储的是uchar的类型,用这个代码去读这个像素值:stixelImg.at<float>(1,1),读出来是一个错误的值,读出来是0,并且计算前面加了一个float()函数进行类型转换,也依旧是0

4.

 用这个代码存储图片:

#include <opencv2/opencv.hpp>
#include <string>


using namespace std;
using namespace cv;


int main(){
    cv::Mat stixelImg = cv::Mat::zeros(3,3, CV_8UC1);

    stixelImg.at<uchar>(1,1) = 255;
    // cout << "pixel: " << int(stixelImg.at<uchar>(1,1)) << endl;
    imwrite("/home/sensetime/a.png",stixelImg);

    return 0;
}

用这个代码读刚才存的这个图片:

#include <opencv2/opencv.hpp>
#include <string>


using namespace std;
using namespace cv;

int main(){
    Mat img = imread("/home/sensetime/a.png",1);
    cout << "pixel: " << int(img.at<uchar>(1,1)) << endl;

    return 0;
}

大于0是按照3通道读,等于0按照灰度图一通道读,小于0按照原始类型读图

我实验过,用大于0的读出来的是错误的值,等于0和小于0都是正确的

注意:因为uint8和uchar差不多,如果直接cout就显示的是字符,而不是我想要的数值,需要int转换一下,前面已经提到,把uint8进行int转换是不会出错的

另一个注意:因为灰度图可以存储为1通道和3通道,我没有去测试过3通道这种情况,不知道到底应该用哪种方式读.为了避免可能3通道造成的bug,先用-1读,然后用channels函数看有几个通道再决定如何读图,也可以用opencv的python看shape看有几个通道

猜你喜欢

转载自www.cnblogs.com/ymjyqsx/p/9074188.html