首页 > 编程语言 >C++,OpenCV图形基础(2)

C++,OpenCV图形基础(2)

时间:2023-04-04 11:33:51浏览次数:35  
标签:const Mat int C++ OpenCV 图像 IMREAD 图形 通道

图像基础

  • 颜色通道
  • RGB 图像有4 个默认通道:红色、绿色和蓝色各有一个通道,以及一个用于编辑图像复合通道(主通道)
  • 彩色深度
  • 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。
  • 16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。
  • 24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。
  • 32位真彩色,即在24位真彩色图像的基础上再增加一个表示图像透明度信息的Alpha通道。
  • Alpha通道:一张图片的透明和半透明度
  • CV_8UC3系列解读
CV_<bit_depth>(S|U|F)C<number_of_channels>
/*
	1.bit_depth: 像素点占用空间大小 bit
	2.S|U|F:
		S:signed int   -->有符号
		U:unsigned int -->无符号
		F:float		   -->单精度浮点
    3.number_of_channels
    	3.1 单通道图像,即为灰度图像
    	3.2 双通道图像
    	3.3 3通道图像
    	4.4 带Alpha通道的彩色图像,4通道图像
*/

读取图像

Mat结构

class  Mat
{
 
public:
 	/*
 		flag: 
 		1.数字签名 
 		2.维度
 		3.通道数
 		4.连续性
 	*/
	int flags;					
	int dims; 					//数据维数
	int rows,cols; 				//数据行列
	uchar *data;				//存储的数据		
    const uchar* datastart;		//数据开始
    const uchar* dataend;		//数据结束
    const uchar* datalimit;		//数据边界
	//其他成员  
 	//.....
 	//其他方法
 	//.....
 public: 		//构造方式
    // 默认构造函数 Mat A;
    Mat ()
    // 常用构造函数 Mat A(10,10,CV_8UC3);
    Mat (int rows, int cols, int type)
    //Mat A(300, 400, CV_8UC3,Scalar(255,255,255));
    Mat (int ndims, const int *sizes, int type, const Scalar &s)
    Mat (Size size, int type)
    Mat (int rows, int cols, int type, const Scalar &s)
    Mat (Size size, int type, const Scalar &s)
    Mat (int ndims, const int *sizes, int type)
    Mat (const Mat &m)
    Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
    Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
    Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
    Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())
    //Mat D (A, Rect(10, 10, 100, 100) );
    Mat (const Mat &m, const Rect &roi)
    Mat (const Mat &m, const Range *ranges)
    
};

格式化打印Mat数据

	cout << "{}方式" << endl << format(img3, Formatter::FMT_C) << endl;
	cout << "C语言方式" << endl << format(img3, Formatter::FMT_NUMPY) << endl;
	cout << ",方式" << endl << format(img3, Formatter::FMT_CSV) << endl;
	cout << "py方式" << endl << format(img3, Formatter::FMT_PYTHON) << endl;
	cout <<"[]:" << img3 << endl;

访问或设置像素强度值

Scalar 它将各个通道的值构成一个整体,赋给具有相同通道数的矩阵元素,通俗点就是一个复合数据

Mat A(10,10,CV_8UC3,Scalar(1,2,3));
//CV_8UC3:8位存储的无符号3通道
//分别把每一个像素点颜色通道赋值为1,2,3

imread函数读取图片

Mat imread( const String& filename, int flags = IMREAD_COLOR );
/****************************************************************
*				filename: 文件路径
*				flags   : 显示方式
*****************************************************************/
enum ImreadModes {
       IMREAD_UNCHANGED            = -1,	//按原样返回加载的图像(带有alpha通道,否则会被裁剪)
       IMREAD_GRAYSCALE            = 0, 	//单通道灰度图像
       IMREAD_COLOR                = 1, 	//3通道BGR彩色图像 
       IMREAD_ANYDEPTH             = 2, 	//16位/32位图977像,其他则转换为8位
       IMREAD_ANYCOLOR             = 4, 	//图像以任何可能的颜色格式读取
       IMREAD_LOAD_GDAL            = 8, 	//gdal驱动程序加载映像
       IMREAD_REDUCED_GRAYSCALE_2  = 16,	//单通道灰度图像,并将图像大小减小1/2 
       IMREAD_REDUCED_COLOR_2      = 17,	//3通道BGR彩色图像,使图像大小减小1/2
       IMREAD_REDUCED_GRAYSCALE_4  = 32,	//单通道灰度图像,并将图像尺寸减小1/4
       IMREAD_REDUCED_COLOR_4      = 33,	//3通道BGR彩色图像,使图像大小减小1/4
       IMREAD_REDUCED_GRAYSCALE_8  = 64,	//单通道灰度图像,并将图像尺寸减小1/8
       IMREAD_REDUCED_COLOR_8      = 65,	//3通道BGR彩色图像,使图像大小减小1/8
       IMREAD_IGNORE_ORIENTATION   = 128	//不要根据EXIF的方向标志旋转图像
};

显示图像

  • imshow()显示图片
imshow(const string& str,InputArray mat);
/*****************************************************/
*			str: 窗口名
*			mat: 图像
*****************************************************/   

销毁窗口

  • destroyAllWindows(): 销毁所有窗口
  • destroyWindow(const char* windowName) :销毁指定窗口

保存图像

  • imwrite()函数保存图片
bool imwrite( const String& filename, InputArray img,
              const std::vector<int>& params = std::vector<int>());
/*****************************************************/
*			filename: 保存的文件名
*			img: 图像
*			params:设置图片质量,压缩率  一般不写
*****************************************************/   

一些案例代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
void TestIntMat() 
{
	//No.1 构造方式
	Mat img(10, 10, CV_8UC1);
	imshow("1", img);
	//std::cout << img << std::endl;
	//No.2
	Mat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));  //BGR
	imshow("2", img2);
	//No.3
	Mat img3 = img2.clone();			//clone方法拷贝
	imshow("3", img3);
	//No.4
	Mat img4;
	img3.copyTo(img4);
	imshow("4", img4);
	
	//No.5
	Mat img5 = imread("mm.jpg");
	imshow("5", img5);
  
	//No.6
	Mat img6 = imread("mm.jpg", IMREAD_GRAYSCALE);
	imshow("6", img6);
	
	Mat img7 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
	imshow("7", img7);

}
void PrintMat() 
{
	Mat mat(10, 10, CV_8UC1);
	//No.1 通过重载方式打印
	std::cout << "重载方式遍历:" << std::endl;
	std::cout << mat << std::endl;
	std::cout << "C:" << std::endl;
	std::cout << format(mat, Formatter::FMT_C) << std::endl;
	std::cout << "py:" << std::endl;
	std::cout << format(mat, Formatter::FMT_NUMPY) << std::endl;
	std::cout << "csv:" << std::endl;
	std::cout << format(mat, Formatter::FMT_CSV) << std::endl;
	std::cout << "py:" << std::endl;
	std::cout << format(mat, Formatter::FMT_PYTHON) << std::endl;
}
void testSaveImg(const char* fileName) 
{
	Mat mm = imread("mm.jpg", IMREAD_GRAYSCALE);
	imshow("mm", mm);
	imwrite(fileName, mm);
}

int main() 
{
	//TestIntMat();
	//PrintMat();
	testSaveImg("love.jpg");
	waitKey(0);
	return 0;
}

标签:const,Mat,int,C++,OpenCV,图像,IMREAD,图形,通道
From: https://blog.51cto.com/u_15959862/6168289

相关文章

  • C++统计写过的代码行数
    一、获得数据1、备份到XML2、改为txt2、进行统计#include<iostream>#include<string>usingnamespacestd;intmain(){ freopen("just.txt","r",stdin); strings; getline(cin,s); intflag=0;longlongcount=0; while(s!="gwj49491649......
  • opencv-python 4.10.4. 反投影直方图
    理论它由MichaelJ.Swain,DanaH.Ballard在他们的论文“Indexingviacolorhistograms”中提出。用简单的话来说,它到底是什么?它用于图像分割或查找图像中感兴趣的对象。简单地说,它创建了与输入图像大小相同(但是是单一通道)的图像,其中每个像素对应于该像素属于对象的概率。在......
  • 2023蓝桥杯省赛C/C++组备赛
    一、简单计算与模拟1.成绩统计#include<bits/stdc++.h>usingnamespacestd;intn;intmain(){ doublepoint; doublejige=0,youxiu=0; cin>>n; for(inti=0;i<n;++i){ cin>>point; if(point>=60){ jige++; if(point&......
  • [计算机图形学] OpenGL读取obj文件并显示其3D效果
       读取三维网格模型(WavefrontOBJ文件)无法向立方体:cube.obj有法向兔子模型:bunny.obj有法向有纹理八字模型:Eight.objOBJ文件的格式可参考:http://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html 利用OpenGL显示该模型的绘制效果(全部)顶点显示线条显示面片显示 核心......
  • C/C++快递自提柜流程模拟系统[2023-04-03]
    C/C++快递自提柜流程模拟系统[2023-04-03]普通用户功能包括:普通用户分为老用户和新用户,新用户需要注册再登录,老用户直接注册并登录,登录时用户名和密码都输入正确才可进入用户界面。进入系统后,用户按照快递单号可以查询订单的所有物流信息:订单编号,快递单号(公司),快递的状态(已出库......
  • 4/3 c++模板 2day
    1.与普通函数的区别{隐式转换必须在参数列标给出类型1.函数模板与普通函数区别2.都可以被重载3.在模板函数和普通函数都可以实现的情况下优先调用普通函数4.test<>(10);可以强制调用函数5.函数模板直接也可以重载,具体使用看最好的匹配}includeusingnamespacestd;tem......
  • c++ std::package_task,task.get_future()
    #include<iostream>#include<future>#include<thread>intcountdown(intfrom,intto){for(inti=from;i!=to;--i){std::cout<<i<<std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));......
  • C++ 引用
    (一)多重含义C++中的*和&有多重含义,在不同的使用条件下有不同的意思:1.*int*p=&a;/1.指针a=a*b;/2.乘法*p=100;/3.指向2.&intc=a&b;/1.位运算转换为二进制int*p=&a;/2.取地址inta=100;int&ar=a;/3.引用(二)引用的......
  • C语言再学习 -- 详解C++/C 面试题 2
    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题。参看:嵌入式程序员面试问题集锦1、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #defineSENCONDS_PER_YEAR(60*60*24*365)UL解答:#define声明一个常量,使用计算常量表达式的值来表明一年中有多少......
  • c++ 宏定义
    #define不被视为语言的一部分Effective中有说明,宁可以编译器替换预处理器(尽量以 const、enum、inline 替换 #define)对于类似函数的宏,尽量使用内联函数替换掉#define当然也有一些经常不得不用到的宏定义,比如c++中条件编译相关的预编译指令,包括#define、#undef、#ifdef、#ifn......