学习笔记 VS之OpenCV(2)图像声明初始化、图像复制问题、RIO感兴趣区域

注:本人学习阶段,文章内容仅供参考,如有错误请指正,谢谢!

一、opencv常用的模版类

  1. Mat:用于图像,或者其余矩阵类型数据。分为头部文件(包含矩阵大小、数据类型、通道数量等基础信息)、数据块(包含图像中的所有像素信息)。
  2. Rect:用于二维矩阵,常用于表示一个矩形框。
  3. Size:尺寸,用于指定图像、矩形大小(width,height)。
  4. Point:点,可用于二维直角坐标系,也可以用于空间二维坐标系(x,y)。
  5. Scalar:标量,最多表诉四个维度标量,多用于颜色。
  6. Range:范围,多用于指定坐标系范围,描述图像某一片区域。
  7. Rotate Rect:旋转矩形。

二、图像声明与初始化

两种初始化方式:

  1. 先声明在初始化
  2. 声明的同时进行初始化图像宽高、图片类型、初始灰度

详细请看代码:

#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. 浅复制:只复制头部文件,共用一个数据块(一.1中有说明),一个对象发生改变另一个也发生改变。
  2. 深复制:重新开辟一个空间,全部都复制,一个对象发生改变,另外一个不会改变。

代码验证:

#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)

说明:就是我们需要一张图片中的某一部分,我们就去获取这一部分区域。

  1. 利用Rect类获取感兴趣区域
  2. 通过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是重新分配的一段空间,所以浅复制没有变化。

六、结尾

学习笔记!

注:如有侵权,请联系本人删除此文章。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值