Opencv图像读写操作

本文详细介绍了如何使用OpenCV进行图像读写,包括矩阵操作的基本规则、像素格式定义及其操作,以及如何利用OpenCV进行色彩空间转换和画图实例。通过实例演示了如何创建、修改和显示图像,是视觉编程初学者不可错过的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视觉入门之Opencv图像读写操作

Opencv图像读写操作

主要内容包括:1、opencv矩阵操作 2、opencv像素格式定义及操作
3、opencv画图

矩阵操作

1、使用规则:
(Row,Column,pixel)
实例:

Mat Movingsign(300,600,CV_8UC3, cv::Scalar(255, 255, 255));

其他构造方法:

  1. Mat::Mat()
    无参数构造方法;
  2. Mat::Mat(int rows, int cols, int type)
    创建行数为 rows,列数为 col,类型为 type 的图像;
  3. Mat::Mat(Size size, int type)
    创建大小为 size,类型为 type 的图像;
  4. Mat::Mat(int rows, int cols, int type, const Scalar& s)
    创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始
    化为值 s;
  5. Mat::Mat(Size size, int type, const Scalar& s)
    创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;
  6. Mat::Mat(const Mat& m)
    将 m 赋值给新创建的对象,此处不会对图像数据进行复制,m 和新对象
    共用图像数据;
  7. Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
    创建行数为 rows,列数为 col,类型为 type 的图像,此构造函数不创建
    图像数据所需内存,而是直接使用 data 所指内存,图像的行步长由 step
    指定。
  8. Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
    创建大小为 size,类型为 type 的图像,此构造函数不创建图像数据所需
    内存,而是直接使用 data 所指内存,图像的行步长由 step 指定。
  9. Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
    创建的新图像为 m 的一部分,具体的范围由 rowRange 和 colRange 指
    定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数
    据;
  10. Mat::Mat(const Mat& m, const Rect& roi)
    创建的新图像为 m 的一部分,具体的范围 roi 指定,此构造函数也不进
    行图像数据的复制操作,新图像与 m 共用图像数据。

像素操作

2、像素格式定义及操作
参考:link
要点:1、色彩空间 2、像素读写 3、像素的定义与使用 4、不同格式间的相互转换 5、存储方式及数据类型。

色彩空间
不同的色彩空间代表着不同的像素存储及定义方式。常见的色彩空间有RGB、YUV、HSV等。值得注意的是,在数据定义时需要注意其大小及数据形式以及读写规则。

像素读写
以RGB为例:

//例1
Mat colorim(600, 800, CV_8UC3);

for( int i = 0; i < colorim.rows; ++i)
 for( int j = 0; j < colorim.cols; ++j )
 {
 Vec3b pixel;
 pixel[0] = i%255; //Blue
 pixel[1] = j%255; //Green
 pixel[2] = 0; //Red
 colorim.at<Vec3b>(i,j) = pixel;
 }

Opencv自带的像素向量:

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d; 
//例2 使用迭代器遍历
MatConstIterator_<Vec3b> it;
Mat_<uchar> image(image1);
MatIterator_ <Vec3b> it = image.begin();

像素的存储
两种像素存储方式:
1、以通道方式定义及存储的图像
2、以Bayer形式存储的图像

画图

(以绘制信号图为例)

//创建矩阵
Mat Movingsign(300,600,CV_8UC3, cv::Scalar(255, 255, 255));
vector<vector<float>> Data;
vector<float> KeyValue;
//vector<Point> ptc;
vector<Point2f> ptc;
const int npts = dataCnt;
float a = 0;
float b = 0;
for (int i = 0; i < dataCnt; i++)
{
	b = abs(abs(dataIn[i])-3.2) * 220;
	a = i / 60;
	//将输入数据画成像素点,并压入堆栈
	Point p(a, b);
	ptc.push_back(p);
}
//将像素点转换为Tuple
Point *pts = new Point[ptc.size()];
Point *pts_b = new Point[ptc.size()];
for (int i = 0; i < ptc.size(); i++)
{
	pts[i] = ptc[i];
	pts_b[i].x = ptc[i].x;
	pts_b[i].y = 300;
}
//画图
for (int i = 0; i < ptc.size()-1; i++)
{
	line(Movingsign, pts[i], pts[i+1],Scalar(0, 0,0),1,8);
}
	/*for (int i = 0; i < ptc.size() - 1; i++)
	{
		line(Movingsign, pts[i], pts_b[i], Scalar(0, 0, 0), 1, 8);
	}*/
imwrite("Sign4_FFT.jpg", Movingsign);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值