OpenCV学习笔记(一)、OpenCV基础教程学习

本文详细介绍了OpenCV库在图像处理中的基本操作,包括加载、显示、修改和保存图像,图像混合,绘制形状和文字,以及各种图像滤波技术。讲解了cvtColor函数、imshow函数、imwrite函数、Mat对象的使用,还涉及到了图像的像素操作、掩码操作、模糊处理、形态学操作、边缘检测等高级技术。文章深入浅出地展示了OpenCV在图像处理领域的强大功能。
摘要由CSDN通过智能技术生成

1、加载、修改、保存图像

(1)加载图像是什么:
Mat src = cv::imread(“D:2222.jpg”);
imread的功能是加载图像文件成为一个Mat对象,第一个参数表示图像的存储路径,第二个参数表示加载的图像是什么类型;
IMREAD_UNCHANGED(<0)表示加载原图,不做任何修改;
IMREAD_GRAYSCALE(=0)表示把原图作为灰度图像加载进来;
IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来;
OpenCV支持加载jpg、png、tiff等格式图像;
(2)图像显示是什么:
cv::namedWindos和cv::imshow;
namedWindos(“Window Title”, WINDOW_AUTOSIZE);
WINDOW_AUTOSIZE表示根据图像大小显示,不能认为修改图像的尺寸大小;
namedWindos表示创建一个OpenCV窗口,它是由OpenCV自动创建和销毁的,无需手动销毁;
imshow(“Window Title”, src);
imshow是根据窗口名称显示图像到指定窗口中去,第一个参数是窗口名称,第二个参数是Mat对象;
(3)修改图像是什么:
cv::cvtColor
cvtColor(src, des, COLOR_BGR2GRAY);
cvtColor的功能是把图像从一个彩色空间转移到另外一个彩色空间,第一个参数表示源图像,第二个参数表示转移到的目标图像,第三个参数表示转移色彩属性,COLOR_BGR2HLS、COLOR_BGR2GAY等;
(4)保存图像是什么:
cv::imwrite
用于保存图像到指定目录中;
只有8位、16位的JPG、PNG、TIFF格式的图像并且单通道或者三通道的BGR的图像才能通过这种方式保存;
保存PNG格式的时候可以保存透明通道的图片;
可以指定压缩参数;
(5)代码演示:

Mat src, des;
src = imread("D:2222.jpg", IMREAD_UNCHANGED);
if(src.empty())
{
   
    cout << "could not read image\n" << endl;
    return -1;
}
nameWindos("Input image", WINDOW_AUTOSIZE);
imshow("Input image", src);

cvtColor(src, des, COLOR_BGR2HLS);
imwrite("D:1234.png", src);

waitKey(0);

5、如何获取图像的像素指针:
获取当前行指针:const uchar* current = myImage.prt(row);
row表示第几行;
获取当前像素点p(row, col)的像素值p(row, col) = current[col];
6、图像像素范围处理saturate_cast
saturate_cast(-100),返回0
saturate_cast(288),返回255
saturate_cast(100),返回100
该函数的功能是确保RGB值范围是在0-255;
7、掩膜操作是什么:
根据掩膜来重新计算每个像素的像素值,掩膜mask也被称为Kernel;
通过掩膜操作来提高图像的对比度;
演示代码:
Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);

nameWindos(“Input image”, WINDOW_AUTOSIZE);
imshow(“Input image”, src);

waitKey(0);
8、Mat对象是什么:
Mat对象是OpenCV2.0之后引入的图像数据结构、自动分配内存、不存在内存泄漏的问题、是面向对象的数据结构,分为头部和数据两部分;
9、Mat对象的构造函数和常用方法是什么:
Mat(); Mat(int rows, int cols, int type); Mat(Size size, int type);
void copyTo(Mat mat) 将当前Mat对象复制到另外一个对象
void convertTo(Mat dst, int type)
Mat clone() 将当前Mat对象克隆给另外一个对象
int channels() 当前对象通道数
int depth() 当前对象的深度
bool empty(); 当前对象图像数据是否为空
uchar* ptr(i=0) 当前对象像素指针
Mat creat(src.size(), src.type()); 创建一个和src对象大小和类型一样的对象

5、图像混合

(1)相关API:
在这里插入图片描述
参数1:输入图像Mat-src1
参数2:输入图像src1的alpha值
参数3:输入图像Mat-src2
参数4:输入图像src2的alpha值
参数5:gamma值
参数6:输出混合图像
注:两张图像的大小和类型必须一致才可以
(2)示例代码:

	Mat src1, src2, dest;    
	src1 = imread("D:/vcprojects/images/LinuxLogo.jpg");     
	src2 = imread("D:/vcprojects/images/win7logo.jpg");     
	if (!src1.data) 
	{
   
         printf("could not load LinuxLogo image...\n");         
         return -1;
    }     
	if (!src2.data) 
	{
   
         printf("could not load win7logo image...\n");
         return -1;     
	}     
	if (src1.rows == src2.rows && src1.cols == src2.cols) 
	{
   
         double alpha = 0.5;
         namedWindow("line-blend", CV_WINDOW_AUTOSIZE);
         addWeighted(src1, (1 - alpha), src2, alpha, 0.0, dest);
         imshow("line-blend", dest);
         waitKey(0);
         return 0;
     }
     else 
    {
   
         printf("image size is not same...\n");
         return -1;
     }

第六课、绘制形状和文字

(1)相关API cv::Point cv::Scalar
Point表示2D平面上一个点x,y
Point p;
p.x = 10;
p.y = 8;
p = Point(10, 8);
Scalar表示四个元素的向量
Scalar(a, b, c); //a = blue, b = green, c = red表示RGB三个通道
(2)如何绘制线、矩形、圆、椭圆等基本几何形状
画线 cv::line (LINE_4\LINE_8\LINE_AA)
画椭圆 cv::elipse
画矩形 cv::rectangle
画圆 cv::circle
画填充 cv::fillPoly
(3)如何生成随机数
cv::RNG
生成高斯随机数gaussian(double sigma)
生成正态分布随机数uniform(int a, int b)
(4)如何添加文字
putText函数中设置fontFace(cv::HersheyFonts)
-fontFace, CV_FONT_HERSHEY_PLAIN
-fontScale, 1.0, 2.0~8.0
7、代码演示

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines(); //画线
void MyRectangle(); //画矩形
void MyEllipse(); //画椭圆
void MyCircle(); //画圆
void MyPolygon(); //画多边形
void RandomLineDemo(); //画自由线
int main(int argc, char** argv) {
   
	bgImage = imread("D:/vcprojects/images/test1.png");
	if (!bgImage.data) {
   
		printf("could not load image...\n");
		return -1;
	}
	MyLines();
	MyRectangle()</
OpenCV是一个广受欢迎的开源计算机视觉库 是一个广受欢迎的开源计算机视觉库 ,它提供了 很多函数,实现很多计算机视觉法,从最基本的 滤波到高级物体检测 皆有涵盖 。很多 初学者希望快速掌握 OpenCV OpenCV OpenCVOpenCV的使用方法 ,但 往会 遇到 各种样的困难。 其 实仔细分析,造成这些困难的原因 有两类:第一是 C/C++/C++/C++/C++编程基础不过关; 第二类是不了解算法原理。 解决 这些 困难无非提升编程能力,以及理论基 础知识。 提升编程能力需要多练习,理论知识系统学《数字图 像处理》、《计算机视觉和模式识别等课程,所有这些都不 像处理》、《计算机视觉和模式识别等课程,所有这些都不 像处理》、《计算机视觉和模式识别等课程,所有这些都不 能一蹴而就 , 需要耐下心来认真修炼。 同时我们也 需要 认识到 OpenCV OpenCV OpenCVOpenCV只是一个算法库, 只是一个算法库, 能为我们搭建计算机视觉 应用提供“砖头”。我们并不需要完全精通了算法原理 应用提供“砖头”。我们并不需要完全精通了算法原理 之后 才去使用 OpenCV OpenCV OpenCVOpenCV, 只要了解“砖头”的功能,就可以动手。在实践中学习 才是最高效的学习 方式。 本小册子希望为初学者提供引导,使快速了解 OpenCV OpenCV OpenCVOpenCV的基本数 据结构以及用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值