Opencv系列(二):Mat类的定义及输出

Opencv系列(二):Mat类的定义及输出

一、数字图像

什么是数字图像?
数字图像是物理图像(客观世界中,以自然形式呈现出的图像,也叫做连续图像)的连续信号值被离散化后,以像素为单元组成的二维矩阵,每个像素通过离散的数值进行表征 (如图)。
在这里插入图片描述
数字图像三要素:
(1)图像大小:图像的长(length)和宽(width),即图像在长度和宽度方向上的像素个数;
(2)图像通道数:可以理解位表征一个像素单元需要的数值个数;比如灰度图只有明暗变化,因此只需要一个数值表征,通道数为1;彩图通常需要三个通道(数值)R、G、B来表征,通过R、G、B不同的比例合成需要的颜色,因此通道数为3;
(3)图像的深度:用来存储表征通道数值所占内存的BIT位数,例如用0~255的整数来表述灰度图每个像素的值,255=28,则8即为图像深度;而由于位数相同,数据类型不同,数值的范围也会不同,因此定义图像矩阵时必须明确数值是有符号(S)型还是无符号型(U),是否为浮点型(F)。
*关于数值类型的详细介绍请参考官网:数值类型

在Opencv中,Mat类表示一个N维单通道或多通道数值矩阵,可以用它来存储由实数或复数构成的向量、矩阵、灰度或彩色图像、体素、向量场、点云、张量和直方图(高维的直方图最好存储在SparseMat中),下面就来介绍Mat类的创建和操作。

二、Mat对象的创建

图像矩阵在Mat对象中的存储:
Mat类由两部分组成:矩阵头(包含矩阵大小、存储方法、存储地址等信息)和一个指向所有像素值的指针。矩阵头的尺寸是常数值,但是矩阵本身的大小可能因图像的不同而不同,并且通常比矩阵头要大几个数量级。
下图是一张3通道彩图在内存中存储的方式,用取色器取色并和内存中数据存储顺序对比,可以看到3原色存储的顺序是B(蓝色)、G(绿色)、R(红色),同一行像素存储在矩阵的同一行,因此当图像大小是mxn时,通道数位c时,矩阵的大小为mxcn。
在这里插入图片描述
Mat对象的创建

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

using namespace cv;
using namespace std;

int main()
{
   
   //---------【Mat对象的使用】-----------
   Mat A = imread("C:\\Users\\ZH\\Desktop\\2_20191012\\1.png", 1);
   //复制和赋值,只创建Mat对象信息头,公用一个矩阵
   Mat B(A);  //复制
   Mat C = A;  //赋值
   
   //创建只引用部分矩阵数据的信息头
   Mat D(A, Rect(1, 400, 100, 500));  //使用Rect()函数
   Mat E = A(Range::all(), Range(1,50));  //使用Range()函数
   
   //clone()函数和copyTo()函数创建信息头并将矩阵复制(会降低运算速度)
   Mat F = A.clone
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将OpenCV中的`cv::Mat`型转换为C++版ZXing库所需的`zxing::BinaryBitmap`型,您需要进行一些额外的步骤。以下是一个示例代码,演示了如何进行这样的转换: ```cpp #include <iostream> #include <zxing/common/GlobalHistogramBinarizer.h> #include <zxing/Binarizer.h> #include <zxing/LuminanceSource.h> #include <zxing/MultiFormatReader.h> #include <zxing/DecodeHints.h> #include <zxing/BinaryBitmap.h> #include <opencv2/opencv.hpp> using namespace zxing; class OpenCVImageSource : public LuminanceSource { private: cv::Mat image; public: OpenCVImageSource(cv::Mat& image) : LuminanceSource(image.cols, image.rows), image(image) {} ArrayRef<char> getRow(int y, ArrayRef<char> row) const override { int width = getWidth(); if (!row) { row = ArrayRef<char>(width); } for (int x = 0; x < width; ++x) { // Assumes grayscale image, so all channels have the same value row[x] = image.at<uchar>(y, x); } return row; } ArrayRef<char> getMatrix() const override { cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); return ArrayRef<char>((char*)gray.data, gray.total()); } bool isCropSupported() const override { return false; } Ref<LuminanceSource> crop(int left, int top, int width, int height) const override { throw std::runtime_error("Crop not supported"); } bool isRotateSupported() const override { return false; } Ref<LuminanceSource> rotateCounterClockwise() const override { throw std::runtime_error("Rotate not supported"); } }; int main() { // 读取图像文件,得到cv::Mat型的图像数据 cv::Mat image = cv::imread("path_to_image.jpg"); // 创建OpenCVImageSource对象,将cv::Mat型转换为zxing的LuminanceSourceOpenCVImageSource source(image); // 创建GlobalHistogramBinarizer对象,将LuminanceSource转换为zxing的Binarizer型 Ref<Binarizer> binarizer = new GlobalHistogramBinarizer(source); // 创建BinaryBitmap对象,将Binarizer转换为zxing的BinaryBitmap型 Ref<BinaryBitmap> bitmap = new BinaryBitmap(binarizer); // 创建DecodeHints对象,设置解码参数 DecodeHints hints(DecodeHints::DEFAULT_HINT); hints.setTryHarder(true); // 创建MultiFormatReader对象,用于解码维码 MultiFormatReader reader(hints); try { // 解码维码 Ref<Result> result = reader.decode(bitmap); // 输出解码结果 std::cout << "Decoded Result: " << result->getText()->getText() << std::endl; } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` 在上面的示例代码中,我们首先使用OpenCV的`cv::imread`函数从图像文件中读取图像数据,并得到一个`cv::Mat`型的图像对象。 然后,我们定义了一个自定义的`OpenCVImageSource`,它继承自ZXing库中的`LuminanceSource`,并实现了其中的虚函数。 在`OpenCVImageSource`中,我们将OpenCV的`cv::Mat`型图像数据转换为ZXing库所需的灰度图像数据。 接下来,我们使用`OpenCVImageSource`对象创建了一个ZXing库的`Binarizer`对象,并将其传递给`BinaryBitmap`对象。 然后,我们创建了`DecodeHints`对象,并设置了解码参数。 最后,我们使用`MultiFormatReader`对象对维码进行解码,并输出解码结果。 请注意,上述示例代码中的 `path_to_image.jpg` 是一个示例图像文件路径,您需要根据实际情况替换为您自己的图像文件路径。 希望这个示例代码能够帮助您将OpenCV中的`cv::Mat`型转换为C++版ZXing库所需的`zxing::BinaryBitmap`型!如有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值