opencv图像点访问学习笔记

注意opencv数据类型
关于uchar,首先了解unsigned和signed区别(这里暂时没有太搞明白,存疑。本质在于二进制的存储方式)
https://blog.csdn.net/gukesdo/article/details/6909766
http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html

vec3b
官网给出了一些数据类型说明

template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

S.O上有大牛做出如下解释:
Vec3b is the abbreviation for “vector with 3 byte entries”
Here those byte entries are unsigned char values to represent values between 0 .. 255.
很助于理解了~

参看https://blog.csdn.net/qq_29540745/article/details/52517269
对文章的小例子进行修改,使赋值过程更明确
并结合http://www.cnblogs.com/newneul/p/8407369.html 文章对彩色图、深度图的理解,进行特别的输出(事实证明,结果也很特别

#include <iostream>
#include <opencv2/opencv.hpp>  
using namespace cv;
using namespace std;
int main()  
{  
    Mat m(3, 3, CV_8UC3);//建立一个三行三列3通道像素  
    Vec3b p;  
    for (int i = 0; i < 3; i++)  
    {  
        for (int j = 0; j < 3; j++)  
        {  
            p[0] = i;  
            p[1] = j;  
            p[2] = i+j;  
            m.at<Vec3b>(i,j) = p; 
            cout<<"p= "<<p<<endl<<"m= "<<m<<endl; 
        }  
    }  
    cout <<"数组:"<<endl<<"M= " << m << endl;  
    int a = m.at<Vec3b>(2, 2)[2];  
    Vec3b b = m.at<Vec3b>(2, 2)[2];  
    cout << "访问一个数:" << a <<endl<<"访问三通道:"<<b<<endl; 
    cout <<"m.at<Vec3b>(2, 2)[2]= "<<m.at<Vec3b>(2, 2)[2]<<endl;//输出很奇怪
    cout <<"(char) m.at<Vec3b>(2, 2)[2]= "<<(char)m.at<Vec3b>(2, 2)[2]<<endl;//输出很奇怪+1
    cout <<"m.ptr<Vec3b>(2, 2)[2]= " << m.ptr<Vec3b>(2, 2)[2]<<endl;//输出很奇怪+2
    return 0;  
}  

这里写图片描述
关于最后三项奇怪的输出,原文这样解释:
测试像素的输出效果,这里无法通过cout<<color.at<cv::Vec3b>(471,537)[0]这种方式来输出第一个通道的值,因为每个通道的像素占了8位而unsigned char表示ascii码 所以输出的时候不是正确的数字,可以通过下面的方式强制转化为int类型(或者用自带的类型转换方式进行显示转换),就可以看到内部的值了。需要注意的一点是 cout页无法输出char类型的变量的地址,也是需要强制转换成void *类型的指针才能正常输出char类型变量的地址信息。

(笔者暂时没明白- -!)

深度图像的像素占16位,普通图片每个通道的像素为8位(但是有什么影响吗?

猜你喜欢

转载自blog.csdn.net/sinat_28752257/article/details/80249858
今日推荐