OpenCV编程学习1

本文介绍了OpenCV中的图像处理模块Imgproc,重点讲解了Mat类及其常用函数,包括创建子矩阵、复制与转换等功能。此外,还提及了图像的几何变换,如坐标映射、平移、旋转等,以及使用remap函数进行重映射的方法。内容覆盖了OpenCV的基础操作,为后续深入学习打下基础。
摘要由CSDN通过智能技术生成

OpenCV的主要模块:

  • Core—核心组件模块
  • Imgproc—图像处理模块
  • Highgui—顶层GUI及视频I/O
  • Video—视频分析
  • Calib3d—摄像机标定及三维重建
  • Features2d—2维特征框架
  • Objdetect—目标检测
  • M1—机器学习
  • Flann—聚类及多维空间搜索
  • Gpu—计算机视觉中GPU加速
  • Stitching—图像拼接
    Mat类
    图像数据结构Mat类能够自动管理内存,Mat类由矩阵头和指向存储所有像素值的矩阵的指针构成
    Mat类常用函数功能
    Mat::row 创建一个具有指定了矩阵头中行数的参数的矩阵
    Mat::col 创建一个具有指定了矩阵头中列数的参数的矩阵
    Mat::rowRange 为指定的行span创建一个新的矩阵头,可取指定行区间元素
    Mat::colRange 为指定的列span创建一个新的矩阵头,可取指定列区间元素
    Mat::clone 创建一个数组及其基础数据的完整版本
    Mat::copyTo 把矩阵复制到另一个矩阵中
    Mat::convertTo 在缩放或不缩放的情况下转换为另一种数据类型
    Mat::zeros 返回指定大小和类型的零数组
    Mat::ones 返回一个指定大小和类型全为1的数组
    Mat::channels 返回矩阵通道的数目
    Mat::empty 如果数据没有elements,返回true
    Mat::at 返回对指定数组元素的引用
    代码1.1
//图像读取显示保存操作
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
	//读入图像
	Mat srcImage = imread("dog.png");
	if (srcImage.empty())
	{
		return -1;
		cout << "未找到图像" << endl;
	}
	//转为灰度图
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	imshow("srcGray", srcGray);
	//均值平滑
	Mat blurDstImage;
	blur(srcGray, blurDstImage, cv::Size(5, 5),cv::Point(-1,-1));
	cv::imshow("blurDstImage", blurDstImage);
	//写入图像
	imwrite("blurDstImage.png", blurDstImage);
	cv::waitKey(0);
	return 0;

}

左图为灰度图,右图为平滑后的图像
在这里插入图片描述

图像的几何变换

图像的几何变换是指在不改变图像像素值的前提下对图像像素进行空间几何变换,常见的几何变换有距离变换、坐标映射、平移、镜像、旋转、缩放、仿射变换等。
坐标映射
图像的坐标映射是通过图像和目标图像之间建立一种映射关系,包含正映射和反映射。

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
	//读入图像
	Mat image = imread("..\\dog.png");
	if (image.empty())
	{
		return -1;
		cout << "未找到图像" << endl;
	}
	cv::Mat resultimage(image.size(), image.type());
	cv::Mat xmapimage(image.size(), CV_32FC1);
	cv::Mat ymapimage(image.size(), CV_32FC1);
	int rows = image.rows;
	int cols = image.cols;
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			xmapimage.at<float>(i, j) = cols - j;
			ymapimage.at<float>(i, j) = rows - i;
		}
		remap(image, resultimage, xmapimage, ymapimage, CV_INTER_LINEAR,
			cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
		cv::imshow("image", image);
		cv::imshow("resultimage", resultimage);
	}
	waitKey(0);
	return 0;
}

在这里插入图片描述
重映射函数
remap(image, resultimage, xmapimage, ymapimage, CV_INTER_LINEAR,
cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
前两项分别代表输入和输出图像,之后两项代表x,y坐标,
插值方法、边界插值类型、插值数值

今天先到这,明天继续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要: 本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录  [隐藏] 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1) 总体描述 1.1.2 (2) 功能 1.1.3 (3) OpenCV模块 1.2 2、有用的学习资源 1.2.1 (1) 参考手册: 1.2.2 (2) 网络资源: 1.2.3 (3) 书籍: 1.2.4 (4) 视频处理例程(在 /samples/c/): 1.2.5 (5) 图像处理例程 (在 /samples/c/): 1.3 3、OpenCV 命名规则 1.3.1 (1) 函数名: 1.3.2 (2) 矩阵数据类型: 1.3.3 (3) 图像数据类型: 1.3.4 (4) 头文件: 1.4 4、编译建议 1.4.1 (1) Linux: 1.4.2 (2) Windows: 1.5 5、C例程 2 二、GUI 指令 2.1 1、窗口管理 2.1.1 (1) 创建和定位一个新窗口: 2.1.2 (2) 载入图像: 2.1.3 (3) 显示图像: 2.1.4 (4) 关闭窗口: 2.1.5 (5) 改变窗口大小: 2.2 2、输入处理 2.2.1 (1) 处理鼠标事件: 2.2.2 (2) 处理键盘事件: 2.2.3 (3) 处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1) IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1) 矩阵: 3.2.2 (2) 一般矩阵: 3.2.3 (3) 标量: 3.3 3、其它结构类型 3.3.1 (1) 点: 3.3.2 (2) 矩形框大小(以像素为精度): 3.3.3 (3) 矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1) 分配内存给一幅新图像: 4.1.2 (2) 释放图像: 4.1.3 (3) 复制图像: 4.1.4 (4) 设置/获取感兴趣区域ROI: 4.1.5 (5) 设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1) 从文件中读入图像: 4.2.2 (2) 保存图像: 4.3 3、访问图像像素 4.3.1 (1) 假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3) 直接访问: (效率高,但容易出错) 4.3.4 (4) 基于指针的直接访问: (简单高效) 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1) 字节型图像的灰度-彩色转换: 4.4.2 (2) 彩色图像->灰度图像: 4.4.3 (3) 不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1) 绘制矩形: 4.5.2 (2) 绘制圆形: 4.5.3 (3) 绘制线段: 4.5.4 (4) 绘制一组线段: 4.5.5 (5) 绘制一组填充颜色的多边形: 4.5.6 (6) 文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1) 总体上: 5.1.2 (2) 为新矩阵分配内存: 5.1.3 (3) 释放矩阵内存: 5.1.4 (4) 复制矩阵: 5.1.5 (5) 初始化矩阵: 5.1.6 (6) 初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2) 间接访问: 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5) 对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算 5.3.1 (1) 矩阵之间的运算: 5.3.2 (2) 矩阵之间的元素级运算: 5.3.3 (3) 向量乘积: 5.3.4 (4) 单一矩阵的运算: 5.3.5 (5) 非齐次线性方程求解: 5.3.6 (6) 特征值与特征向量 (矩阵为方阵): 6 六、视频处理 6.1 1、从视频流中捕捉一帧画面 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. 6.1.2 (2) 初始化一个摄像头捕捉器: 6.1.3 (3) 初始化一个视频文件捕捉器: 6.1.4 (4) 捕捉一帧画面: 6.1.5 (5) 释放视频流捕捉器: 6.2 2、获取/设置视频流信息 6.2.1 (1) 获取视频流设备信息:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值