2019-10-01 opencv图像数据结构之Mat

2019-10-01 opencv图像数据结构之Mat,第1张

      Mat的本质是具有两个数据部分的类:矩阵头(包含诸如矩阵大小,用于存储的方法,用于存储矩阵的地址等信息)以及指向真正图像数据矩阵的指针。矩阵头的大小是恒定的,但真正的图像矩阵的大小是因实际图像的大小而异。

        opencv是图像处理库,包含有大量的图像处理功能。这些功能在程序中表现为一个一个函数的形式,那么为了处理图像,一定少不了在函数间传递图像。如果每传递一次图像就为其新分配一次内存空间,必然会导致图像处理速度的大大下降,同时也会占用过高的内存空间。为了解决这个问题,opencv是这样做的:每个Mat对象都有其唯一的矩阵头,但是实质性的图像矩阵地址可以共享,访问方式可以通过指针。在这种机制下,在程序中如果需要传递图像时,仅传递图像的矩阵头信息和指针,而不会去传递实质性的图像数据。

  例子1: Mat A, C;// creates just the header parts

                A = imread (argv[1], IMREAD_COLOR );// here we'll know the method used (allocate matrix)

                Mat B(A);// Use the copy constructor

                C = A;// Assignment operator

        例子1中,3个Mat对象 A,B,C所指向的实质性的图像数据矩阵是同一个,但是它们的矩阵头信息(身份z号)是不同的。由于实质性的图像数据矩阵是同一个,所以改变A,B,C中的任何一个,另外两个也会改变。这种改变表现在它们的矩阵头信息的变化上。例如,通过对A *** 作把图像大小减小了一半,那么B,C的矩阵头信息中表征图像大小的信息部分一定也会变。在这种机制基础之上会有一个有意思的事情发生,你完全可以创建一个只引用实质图像矩阵的子部分信息的矩阵头。这种应用有一个很好的例子,它是:ROI,只需创建具有新边界的新标题即可,如下面例子2,其中 Mat 对象D,E只引用了A所引用的图像的一部分。

    例子2:Mat D (A, Rect (10, 10, 100, 100) );// using a rectangle

                Mat E = A(Range::all(), Range(1,3));// using row and column boundaries

            图像在内存中的整个生命周期中会有一个计数变量与其相关,这个变量有什么用呢?它用来表征,有多少个Mat 对象,引用这个图像,当这个计数变量值为0时,系统会释放掉图像 所占内存。当然有时也许要真正完全传递整个图像而不是指针,因此opencv提供了 cv :: Mat :: clone() 和 cv :: Mat :: copyTo() 函数来解决这个问题,如下例子3。

      例子3:Mat F = Aclone();

                    Mat G;

                    AcopyTo(G);

            例子3中,A,F,G指针所指的实质性图像矩阵不是同一个,因此通过A,F,G对图像 *** 作,相互之间不会有影响 。

        存放方法的描述是关于如何存储像素值的(说明存放像素有多种方法可以选择)。这种选择,体现在色彩空间和数据类型的选择上。色彩空间不同,也就是对颜色编码的方式不同。最简单的一种是灰度空间,在灰度空间下我们可以使用白色和黑色的不同组合来创建许多灰色阴影。

        对应颜色,我们有多种编码方式选择,比较主流的是RGB。RGB主流的原因和我们人眼编码颜色的方式有关系。它的基色是

红色,绿色和蓝色。为了编码颜色的透明度,有时会添加第4个量:alpha(A)。

但是还有很多其他色彩空间系统,并且各有优点:

  1、  RGB是最常见的一种,因为我们的眼睛使用的,就是类似的系统。但是opencv标准显示系统使用BGR色彩空间(红、蓝通道切换)来编码颜色。

  2、 HSV和HLS将颜色分解为它们的色相,饱和度和值/亮度分量,这是我们描述颜色更自然的方法。例如,您可以忽略最后一个变量,从而使算法对输入图像的光照条件不太敏感。

  3、 流行的JPEG图像格式使用的YCrCb。

    4、CIE Lab是一个感知上统一的色彩空间,如果您需要测量给定颜色与另一种颜色空间的差距,它会派上用场。

色彩空间解决的是一信号有多少通道的问题(多少变量),那么数据类型解决的是,一个变量几位数据位(是否有符号,是整数还是实数)度量它的问题。

OpenCV是一个开源的图像处理库,QML是Qt官方推出的一个描述性语言,QtMarkupLanguage,QtQuick也是Qt官方推出的一个技术框架,在开发嵌入式、动态触屏等时有一定的优势。

模块的作用:

打一个很简单的比方,QML就是Qt的HTML,C就是Qt的JavaScript,而QtQuick相当于一些已经集成好的开发框架,使开发应用程序变得更加简单省事。

OpenCV是一个基于C/C的开源图像处理库,和Qt本身没有太多关联,其主要是用于计算机视觉和图形开发,Qt的扩展应用OpenCV并不是每个应用程序都要用到,只是某些有特殊需求的应用程序可以更方便地使用Qt扩展的OpenCV应用。比如说用Qt开发一个软件,要使用人脸识别功能,就可以集成OpenCV来实现。

使用频率:

虽然说QML相当于HTML,C相当于JavaScript,但是还是有一定区别:所有的网页都是通过解析HTML渲染出的,JavaScript虽然可以动态改变网页,但是最终还是通过改变HTML来达到效果;QML、C的关系恰好反过来,在Qt中,C是“更加底层”的,QML使用更加简单的标记语言的语法来调用底层的C绘图支持API,从而提高程序开发的效率。

使用QML可以更快速、简捷地开发应用程序,在Qt中的使用频率也是很高的,不过这要根据特定开发人群、开发目标而定。有些开发者习惯直接使用C开发,而有些开发者更喜欢简单的QML,很多时候都是“用QML开发用户界面,用C开发业务逻辑”,但是用C开发用户界面的也不在少数。

QtQuick是一套开发框架,核心语言就是QML。

QtQuick的使用频率不低,从Qt的NewProject界面就可以看出,QtQuick是和Qt传统的CWidge平起平坐的(当然还有QtforPython等)。

OpenCV在不需要图形处理功能的情况下是不需要用到的,所以不怎么好说“使用频率”,因为这是针对特定的软件需求来的。

是否有必要学习:

QtQuick能够使应用程序开发更有效率,但是并不是开发一个程序必备的,能用QtQuick开发的,C肯定能够做出来,但是耗费时间、精力更多。在Qt开发工作这一块,掌握Qt的核心功能是必须的,而且这还远远不够。在招聘的时候肯定是考察应聘者对Qt各种技术和开发思想的理解和掌握情况,而QtQuick是官方推出的框架,掌握其开发方法应该是基本功。

1opencv一定要是自己用CMake编译的mingw版本!就因为老是编译不成功,导致我费了一周也没配置好。换系统、换不同版本的opencv,重装Qt根本没用。

2qt程序运行的时候要把opencv的相应dll文件拷贝到对应的Debug文件夹中去,即和pro、cpp等放在一起。

首先下载Opencv软件,我下载的版本是247,然后双击软件,会d出如下的解压界面,选择文件夹解压即可。

怎样在VS2010下配置Opencv并编写程序

解压好之后在opencv文件夹下面有两个文件夹,分别是“sources”和“build”。

怎样在VS2010下配置Opencv并编写程序

右键点击“计算机”->“属性”然后点击“高级系统设置”(我的电脑是win7的64位系统)。

怎样在VS2010下配置Opencv并编写程序

在“高级”选项下面,点击“环境变量”。

怎样在VS2010下配置Opencv并编写程序

在“系统变量”中选中“Path”然后点击“编辑”。

怎样在VS2010下配置Opencv并编写程序

6

在“变量值”这边填入如下路径“E:\Program files\opencv \build \x64 \vc10\bin”,用“;”与前面内容隔开。这里根据自己解压的文件夹的位置进行相应的修改,我的电脑是64位系统,所以这里我选择了x64文件夹,32位系统选择x86文件夹即可。

交叉编译OpenCV后,您不需要再使用CMake重新编译。当您交叉编译OpenCV时,已经使用了CMake生成了构建文件并为特定目标平台(例如ARM架构)编译了源代码。因此,一旦交叉编译成功完成,您就可以在目标平台上使用生成的库和头文件。

在交叉编译OpenCV后,请将生成的库文件(libopencv_so)和头文件(include目录中的h文件)拷贝到目标设备的相应文件夹中。然后,您可以在目标设备上编译和链接OpenCV应用程序。

确保在编译OpenCV应用程序时,正确地指定库文件和头文件的路径。如果您在目标设备上使用CMake构建应用程序,请在CMakeListstxt文件中指定这些路径,以便找到交叉编译的OpenCV库和头文件。例如:

# 设置OpenCV的路径

set(OpenCV_DIR "/path/to/cross-compiled/opencv")

# 寻找OpenCV库

find_package(OpenCV REQUIRED)

# 添加头文件

include_directories(${OpenCV_INCLUDE_DIRS})

# 将OpenCV库链接到目标应用程序

target_link_libraries(your_target_app ${OpenCV_LIBS})

这里的/path/to/cross-compiled/opencv应替换为您在目标设备上放置交叉编译的OpenCV库和头文件的路径。然后,按照正常流程编译您的OpenCV应用程序即可。

开始-运行-cmd打开命令行窗口,输入你程序所在的盘名(例D:)会出现D:\>符号,然后输入cd(打开的意思)复制你的程序编译之后的debug或者release窗口,(例如,我建立在F盘下的firstcaption1的项目,我在debug状态下运行的程序,F:\projects\opencv\firstcaption1\Debug),打开之后第一个参数输入你生成的exe文件,第二个参数输入名字(该要放在debug的文件夹内),我的参数输入是firstcaption1exe ajpg回车就会得到你想要的结果了。我应该说得很清楚了吧,你可以再看看带参数的main函数运行方法

以上就是关于2019-10-01 opencv图像数据结构之Mat全部的内容,包括:2019-10-01 opencv图像数据结构之Mat、OpenCV_opencv毛星云、如何在Qt中配置OpenCV开发计算机视觉程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9554405.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存