opencv有基于c语言的教程吗_OpenCV教程(转自:浅墨_毛星云博客)

■ 第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.所以有时候这个参数在调用时我们可以忽略,在看了下面的讲解之后,我们就会发现,如果在调用时忽略这个参数,就表示载入三通道的彩色图像。

可以在OpenCV中标识图像格式的枚举体中取值。通过转到定义,我们可以在higui_c.h中发现这个枚举的定义是这样的:

enum

{

/* 8bit, color or not */

CV_LOAD_IMAGE_UNCHANGED  =-1,

/* 8bit, gray */

CV_LOAD_IMAGE_GRAYSCALE  =0,

/* ?, color */

CV_LOAD_IMAGE_COLOR      =1,

/* any depth, ? */

CV_LOAD_IMAGE_ANYDEPTH   =2,

/* ?, any color */

CV_LOAD_IMAGE_ANYCOLOR   =4

};

相应的解释:

CV_LOAD_IMAGE_UNCHANGED,这个标识在新版本中被废置了,忽略。

CV_LOAD_IMAGE_ANYDEPTH- 如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。

CV_LOAD_IMAGE_COLOR- 如果取这个标识的话,总是转换图像到彩色一体

CV_LOAD_IMAGE_GRAYSCALE- 如果取这个标识的话,始终将图像转换成灰度1

如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3通道图。

如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。

因为flags是int型的变量,如果我们不在这个枚举体中取值的话,还可以这样来:

flags >0返回一个3通道的彩色图像。

flags =0返回灰度图像。

flags <0返回包含Alpha通道的加载的图像。

需要注意的点:输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。

如果你搞怪,flags取1999,也是可以的,这时就表示返回一个3通道的彩色图像。

好了,讲了这么多,来几个载入示例,一看就懂:

Mat image0=imread("dota.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//载入最真实的图像

ge1=imread("dota.jpg",0);//载入灰度图

Mat image2=imread("dota.jpg",199);//载入3通道的彩色图像

Mat logo=imread("dota_logo.jpg");//载入3通道的彩色图像

2.namedWindow函数

顾名思义,namedWindow函数,用于创建一个窗口。

函数原型是这样的:

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );

■ 第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

■ 第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)

WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。

WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

函数剖析:

首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。

namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。

我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。

但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。

3.imshow函数

在指定的窗口中显示一幅图像。

void imshow(const string& winname, InputArray mat);

■ 第一个参数,const string&类型的winname,填需要显示的窗口标识名称。

■ 第二个参数,InputArray 类型的mat,填需要显示的图像。

这里的InputArray 我们讲一下吧,不然一直是个梗在这边。通过转到定义大法,我们可以在

Highgui.hpp中查到imshow的原型:

CV_EXPORTS_W void imshow(const string&winname, InputArray mat);

进一步对InputArray转到定义,在core.hpp中查到一个typedef声明:

typedef const _InputArray& InputArray;

这其实一个类型声明引用,就是说_InputArray和InputArray是一个意思,既然他们是一个意思,我们就来做最后一步,对_InputArray进行转到定义,终于,我们在core.hpp发现了InputArray的真身:

class CV_EXPORTS _InputArray

{

public:

enum {

KIND_SHIFT = 16,

FIXED_TYPE = 0x8000 <

FIXED_SIZE = 0x4000 <

KIND_MASK = ~(FIXED_TYPE|FIXED_SIZE) - (1 <

NONE              = 0 <

MAT               = 1 <

MATX              = 2 <

STD_VECTOR        = 3 <

STD_VECTOR_VECTOR = 4 <

STD_VECTOR_MAT    = 5 <

EXPR              = 6 <

OPENGL_BUFFER     = 7 <

OPENGL_TEXTURE    = 8 <

GPU_MAT           = 9 <

OCL_MAT           =10 <

};

_InputArray();

_InputArray(const Mat& m);

_InputArray(const MatExpr& expr);

template _InputArray(const _Tp* vec, int n);

template _InputArray(const vector<_tp>&vec);

template _InputArray(constvector >& vec);

_InputArray(const vector& vec);

template _InputArray(const vector>& vec);

template _InputArray(const Mat_<_tp>& m);

template _InputArray(constMatx<_tp>& matx);

_InputArray(const Scalar& s);

_InputArray(const double& val);

// 

_InputArray(const GlBuffer& buf);

_InputArray(const GlTexture& tex);

// >

_InputArray(const gpu::GpuMat& d_mat);

_InputArray(const ogl::Buffer& buf);

_InputArray(const ogl::Texture2D& tex);

virtual Mat getMat(int i=-1) const;

virtual void getMatVector(vector& mv) const;

// 

virtual GlBuffer getGlBuffer() const;

virtual GlTexture getGlTexture() const;

// >

virtual gpu::GpuMat getGpuMat() const;

/*virtual*/ ogl::Buffer getOGlBuffer() const;

/*virtual*/ ogl::Texture2D getOGlTexture2D() const;

virtual int kind() const;

virtual Size size(int i=-1) const;

virtual size_t total(int i=-1) const;

virtual int type(int i=-1) const;

virtual int depth(int i=-1) const;

virtual int channels(int i=-1) const;

virtual bool empty() const;

#ifdefOPENCV_CAN_BREAK_BINARY_COMPATIBILITY

virtual ~_InputArray();

#endif

int flags;

void* obj;

Size sz;

};

可以看到,_InputArray类的里面首先定义了一个枚举,然后是各类的模板类型和一些方法。更复杂的我们暂且不挖深讲了,很多时候,遇到函数原型中的InputArray类型,我们把它简单地当做Mat类型就行了。

imshow 函数详解:

imshow 函数用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度:

如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。

如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是说,值的范围是[0,255 x 256]映射到[0,255]。

如果图像是32位浮点型(32-bit floating-point),像素值便要乘以255。也就是说,该值的范围是[0,1]映射到[0,255]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值