Mat对象:图像文件的内存数据对象
读取为 Mat 对象
读取图像位Mat对象,获取图像的相关信息
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("f:/temp/images/lena.jpg", IMREAD_GRAYSCALE); if (src.empty()) { printf("Could not find the image!\n"); return -1; } namedWindow("002-demo", WINDOW_AUTOSIZE); imshow("002-demo", src); // 获取图像的宽度 int width = src.cols; // 获取图像的高度 int height = src.rows; // 获取图像的通道数 int dim = src.channels(); int depth = src.depth(); int type = src.type(); if (type == CV_8UC1) { printf("type:CV_8UC1\n"); } // 这里打印出来depth和type有时候为0,并不代表深度为0,而是代表一个枚举类型的值 printf("width: %d, height: %d, dim: %d, depth: %d, type: %d\n", width, height, dim, depth, type); waitKey(0); destroyAllWindows(); return 0; }
图像的类型与结构信息:
#ifndef OPENCV_CORE_HAL_INTERFACE_H #define OPENCV_CORE_HAL_INTERFACE_H //! @addtogroup core_hal_interface //! @{ //! @name Return codes //! @{ #define CV_HAL_ERROR_OK 0 #define CV_HAL_ERROR_NOT_IMPLEMENTED 1 #define CV_HAL_ERROR_UNKNOWN -1 //! @} #ifdef __cplusplus #include <cstddef> #else #include <stddef.h> #include <stdbool.h> #endif //! @name Data types //! primitive types //! - schar - signed 1 byte integer //! - uchar - unsigned 1 byte integer //! - short - signed 2 byte integer //! - ushort - unsigned 2 byte integer //! - int - signed 4 byte integer //! - uint - unsigned 4 byte integer //! - int64 - signed 8 byte integer //! - uint64 - unsigned 8 byte integer //! @{ #if !defined _MSC_VER && !defined __BORLANDC__ # if defined __cplusplus && __cplusplus >= 201103L && !defined __APPLE__ # include <cstdint> # ifdef __NEWLIB__ typedef unsigned int uint; # else typedef std::uint32_t uint; # endif # else # include <stdint.h> typedef uint32_t uint; # endif #else typedef unsigned uint; #endif typedef signed char schar; #ifndef __IPL_H__ typedef unsigned char uchar; typedef unsigned short ushort; #endif #if defined _MSC_VER || defined __BORLANDC__ typedef __int64 int64; typedef unsigned __int64 uint64; # define CV_BIG_INT(n) n##I64 # define CV_BIG_UINT(n) n##UI64 #else typedef int64_t int64; typedef uint64_t uint64; # define CV_BIG_INT(n) n##LL # define CV_BIG_UINT(n) n##ULL #endif #define CV_USRTYPE1 (void)"CV_USRTYPE1 support has been dropped in OpenCV 4.0" #define CV_CN_MAX 512 #define CV_CN_SHIFT 3 #define CV_DEPTH_MAX (1 << CV_CN_SHIFT) #define CV_8U 0 #define CV_8S 1 #define CV_16U 2 #define CV_16S 3 #define CV_32S 4 #define CV_32F 5 #define CV_64F 6 #define CV_16F 7 #define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) #define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK) #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) #define CV_MAKE_TYPE CV_MAKETYPE #define CV_8UC1 CV_MAKETYPE(CV_8U,1) #define CV_8UC2 CV_MAKETYPE(CV_8U,2) #define CV_8UC3 CV_MAKETYPE(CV_8U,3) #define CV_8UC4 CV_MAKETYPE(CV_8U,4) #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) #define CV_8SC1 CV_MAKETYPE(CV_8S,1) #define CV_8SC2 CV_MAKETYPE(CV_8S,2) #define CV_8SC3 CV_MAKETYPE(CV_8S,3) #define CV_8SC4 CV_MAKETYPE(CV_8S,4) #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) #define CV_16UC1 CV_MAKETYPE(CV_16U,1) #define CV_16UC2 CV_MAKETYPE(CV_16U,2) #define CV_16UC3 CV_MAKETYPE(CV_16U,3) #define CV_16UC4 CV_MAKETYPE(CV_16U,4) #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) #define CV_16SC1 CV_MAKETYPE(CV_16S,1) #define CV_16SC2 CV_MAKETYPE(CV_16S,2) #define CV_16SC3 CV_MAKETYPE(CV_16S,3) #define CV_16SC4 CV_MAKETYPE(CV_16S,4) #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) #define CV_32SC1 CV_MAKETYPE(CV_32S,1) #define CV_32SC2 CV_MAKETYPE(CV_32S,2) #define CV_32SC3 CV_MAKETYPE(CV_32S,3) #define CV_32SC4 CV_MAKETYPE(CV_32S,4) #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) #define CV_32FC1 CV_MAKETYPE(CV_32F,1) #define CV_32FC2 CV_MAKETYPE(CV_32F,2) #define CV_32FC3 CV_MAKETYPE(CV_32F,3) #define CV_32FC4 CV_MAKETYPE(CV_32F,4) #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) #define CV_64FC1 CV_MAKETYPE(CV_64F,1) #define CV_64FC2 CV_MAKETYPE(CV_64F,2) #define CV_64FC3 CV_MAKETYPE(CV_64F,3) #define CV_64FC4 CV_MAKETYPE(CV_64F,4) #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) #define CV_16FC1 CV_MAKETYPE(CV_16F,1) #define CV_16FC2 CV_MAKETYPE(CV_16F,2) #define CV_16FC3 CV_MAKETYPE(CV_16F,3) #define CV_16FC4 CV_MAKETYPE(CV_16F,4) #define CV_16FC(n) CV_MAKETYPE(CV_16F,(n)) //! @} //! @name Comparison operation //! @sa cv::CmpTypes //! @{ #define CV_HAL_CMP_EQ 0 #define CV_HAL_CMP_GT 1 #define CV_HAL_CMP_GE 2 #define CV_HAL_CMP_LT 3 #define CV_HAL_CMP_LE 4 #define CV_HAL_CMP_NE 5 //! @} //! @name Border processing modes //! @sa cv::BorderTypes //! @{ #define CV_HAL_BORDER_CONSTANT 0 #define CV_HAL_BORDER_REPLICATE 1 #define CV_HAL_BORDER_REFLECT 2 #define CV_HAL_BORDER_WRAP 3 #define CV_HAL_BORDER_REFLECT_101 4 #define CV_HAL_BORDER_TRANSPARENT 5 #define CV_HAL_BORDER_ISOLATED 16 //! @} //! @name DFT flags //! @{ #define CV_HAL_DFT_INVERSE 1 #define CV_HAL_DFT_SCALE 2 #define CV_HAL_DFT_ROWS 4 #define CV_HAL_DFT_COMPLEX_OUTPUT 16 #define CV_HAL_DFT_REAL_OUTPUT 32 #define CV_HAL_DFT_TWO_STAGE 64 #define CV_HAL_DFT_STAGE_COLS 128 #define CV_HAL_DFT_IS_CONTINUOUS 512 #define CV_HAL_DFT_IS_INPLACE 1024 //! @} //! @name SVD flags //! @{ #define CV_HAL_SVD_NO_UV 1 #define CV_HAL_SVD_SHORT_UV 2 #define CV_HAL_SVD_MODIFY_A 4 #define CV_HAL_SVD_FULL_UV 8 //! @} //! @name Gemm flags //! @{ #define CV_HAL_GEMM_1_T 1 #define CV_HAL_GEMM_2_T 2 #define CV_HAL_GEMM_3_T 4 //! @} //! @} #endif
创建 Mat 对象
// 创建mat对象 Mat t1 = Mat(256, 256, CV_8UC3); // Scalar(...) 是一个标量,表示一个颜色值 // 灰度图像是一个通道的,一个参数就可以 t1 = Scalar(0, 0, 255); imshow("t1", t1); // 方法2 Mat t2 = Mat(Size(512, 512), CV_8UC3); t2 = Scalar(255, 0, 255); imshow("t2", t2); // 创建时指定大小 Mat t3 = Mat::zeros(Size(256, 256), CV_8UC3); imshow("t3", t3); // 从现有的图像create // 只是对象引用的赋值,本质上还是一张图像 // 如果对原图像进行修改,t4也会被修改 Mat t4 = src; // 克隆,是一个新的对象 // 对原图进行修改,t5并不改变 Mat t5 = src.clone(); imshow("t5", t5); // 拷贝 Mat t6; src.copyTo(t6); imshow("t6", t6); // 创建一个和现有图像大小、类型一样的空白图像 Mat t7 = Mat::zeros(src.size(), src.type());
来源:https://www.cnblogs.com/wbyixx/p/12241903.html