注:本人学习阶段,文章内容仅供参考,如有错误请指正,谢谢!
一、opencv常用的模版类
- Mat:用于图像,或者其余矩阵类型数据。分为头部文件(包含矩阵大小、数据类型、通道数量等基础信息)、数据块(包含图像中的所有像素信息)。
- Rect:用于二维矩阵,常用于表示一个矩形框。
- Size:尺寸,用于指定图像、矩形大小(width,height)。
- Point:点,可用于二维直角坐标系,也可以用于空间二维坐标系(x,y)。
- Scalar:标量,最多表诉四个维度标量,多用于颜色。
- Range:范围,多用于指定坐标系范围,描述图像某一片区域。
- Rotate Rect:旋转矩形。
二、图像声明与初始化
两种初始化方式:
- 先声明在初始化
- 声明的同时进行初始化图像宽高、图片类型、初始灰度
详细请看代码:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//1)先声明在初始化
Mat img1, img2;
//指定图像的大小、色彩类型
//CV_8UC3 CV:opencv、8:图片位深、 3:三通道
img1.create(520, 520, CV_8U);
//图像的像素灰度
img1 = Scalar(100);
img2.create(Size(200, 200), CV_8UC3);
img2 = Scalar(100, 100, 255);
//颜色空间0~255 0为黑色 255为白色
//2)声明的同时进行初始化图像宽高、图片类型、初始灰度
Mat img3(520, 520, CV_8U, 1);
return 0;
}
图像:
img1,img2,img3的成像
三、图像复制深浅
图像复制深浅与深拷贝浅拷贝一样。
- 浅复制:只复制头部文件,共用一个数据块(一.1中有说明),一个对象发生改变另一个也发生改变。
- 深复制:重新开辟一个空间,全部都复制,一个对象发生改变,另外一个不会改变。
代码验证:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("D:\\Users\\星小白\\Desktop\\图片\\1.png", -1);
//浅复制
Mat img_cpy = img;
//深复制
Mat img_shen;
img.copyTo(img_shen);
//cvtColor(img, img, cv::COLOR_BGR2GRAY);
//在这里改变一下原图像,在原图中画矩形框
rectangle(img,Point(50,50),Point(100,100),Scalar(255,255,0),2,8);
imshow("img", img);
imshow("img_cpy", img_cpy);
imshow("img_shen", img_shen);
waitKey(0);
return 0;
}
验证结果:
rectangle(img,Point(50,50),Point(100,100),Scalar(255,255,0),2,8);这个函数的作用是在图像中绘制一个矩形框,如下图img左上角
img原图:
img_cpy浅复制图:
img_shen深复制图:
由上面图像可清晰的知道深复制不会因为原图像改变而改变,但浅复制就会改变。
四、RIO感兴趣区域(Rect、Range)
说明:就是我们需要一张图片中的某一部分,我们就去获取这一部分区域。
- 利用Rect类获取感兴趣区域
- 通过Range获取图像ROI区域
代码演示:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("D:\\Users\\星小白\\Desktop\\图片\\1.png", -1);
//ROI感兴趣区域
//Rect
Rect rect(100, 100, 200, 200);
Mat img_Rect = img(rect);
imshow("Rect", img_Rect);
//通过Range获取图像ROI区域
Range Row(100, 500);//行
Range Col(200, 500);//列
Mat img_roi = img(Row, Col);
imshow("img_roi", img_roi);
waitKey(0);
return 0;
}
结果展示:
原图:
Rect得到的图像:
Range获得的图像:
在表示Range的时候Row(100,500),Col(200,500),表示一个左上角(100,200)的点到右下角(500,500)的点的一个矩形。
五、遇到的问题
在进行图像浅复制时,有些函数输出图像时是重新分配的一段空间,所以这时一个对象发生改变,另外一个对象不会改变。
例如以下代码:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img3(520, 520, CV_8U, 1);
Mat img = imread("D:\\Users\\星小白\\Desktop\\图片\\1.png", -1);
//浅复制
Mat img_cpy = img;
//深复制
Mat img_shen;
img.copyTo(img_shen);
cvtColor(img, img, cv::COLOR_BGR2GRAY);
//rectangle(img,Point(50,50),Point(100,100),Scalar(255,255,0),2,8);
imshow("img", img);
imshow("img_cpy", img_cpy);
imshow("img_shen", img_shen);
return 0;
}
这里是因为 cvtColor函数输出的img是重新分配的一段空间,所以浅复制没有变化。
六、结尾
学习笔记!
注:如有侵权,请联系本人删除此文章。