资讯专栏INFORMATION COLUMN

OpenCV自学笔记 Day1 1.1-1.3

layman / 327人阅读

摘要:要实现这个功能,需定义一个合适的回调函数。回调函数不会被显式地调用,但是会在响应特定事件的时候被程序调用。

第一次在CSDN记录自己的学习,如有不对的地方,还望大佬指正

1.1.环境搭建

下载OpenCV

官网:https://opencv.org

环境配置

x64/vc15/bin,复制该目录的路径加到你的环境变量中
vs2019 之后的版本都使用vc14

1.2 vs配置

一定要在 x64 下配置

项目属性中修改 包含目录为 build/include
修改库目录为 build/x64/vc15/lib

修改链接器->输入->附加依赖想 添加自己包内的lib
例如:opencv_world3411d.lib

实现原理

opencv_core 负责库的核心功能
#include

opencv_imgproc 包含主要的图像处理函数
#include

opencv_highgui 提供了读写图像和视频的函数以及一些用户交互函数
#include

测试代码

demo1.cpp

1.3.加载,修改,保存图像

加载图像(cv:imread)

修改图像(cv::cvtColor)

保存图像(cv::imwrite)

定义一个表示图像的变量,就是定义一个 Mat类 的对象

Mat image;

查看 image对象的 size 属性:

cout << " This image is " << img.rows << " * " << img.cols << endl;

如何理解 rows 和 cols ?
例如:照片img的像素是400 * 200,即长为 400 像素 ,宽为 200 像素
则有 img.rows = 200; (行)
img.cols = 400; (列)

利用读取函数,从文件中读取一张图片

image = imread("D:/myfile/ME/test.png");

读取完之后可以使用该图片,但是需要检查下图片读取是否正确,利用 empty 函数

if(image.empty()){	cout << " the image is wrong"}

注意的是,若没有分配图像数据,empty函数返回的是 true

接下来为了显示图片,我们需要先定义一个窗口,利用 highgui 中的 namedWindow 来定义窗口,用 imshow 来显示图像

语法:imshow(“窗口名”,对象名)

namedWindow("opencv test");imshow("opencv test",image);

我们将对图像进行一些处理,先来做一个简单的水平处理

Mat result;flip(image,result,1)

其中 flip 函数中的值,正数 表示水平,0 表示垂直,负数 表示水平和垂直

在另一个窗口展现结果

namedWindow("result")imshow("result",result);

由于是控制台窗口,会在 main 函数结束后关闭,我们需要添加一个函数,让他等待。

waitkey(0);

我们可以用 highgui中的函数 把处理过的图像储存在磁盘里

imwrite("output.bmp",result);

highgui 中有一批能帮助我们轻松显示图像并对图像进行操作的函数,例如使用 imread 装载函数的时候,可以通过设置将其转为灰度图像

image = imread("D:/myfile/ME/test.png",IMREAD_GRAYSCALE);

这样生成的图像由无符号字节构成,在 OpenCV 中用常量 CV_8U 表示,即使是灰度图像,但是有时候在读入的时候还是需要将其转换成三通道彩色图像

image = imread("D:/myfile/ME/test.png",IMREAD_COLOR);

这样创建的图像中,每个像素由3个字节,OpenCV中用 CV_8UC3 表示,若输入的是灰度图像,那么三个通道的值都是相等的

如果要在读入图像的时候采用文件本身的格式,只需要将第二个值设置为负数,可用 channels 方法检查图像的通道数

cout << "This image is" << image.channels() << "channels(s)";

highgui 模块中有大量处理图像的函数,其中有可以使程序对鼠标或键盘事件做出相应,也可以在图像上绘制形状或写入文本

1.在图像上点击
通过编程,你可以让鼠标在置于图像窗口上时运行特定的指令。要实现这个功能,需定义一 个合适的回调函数。

回调函数不会被显式地调用,但是会在响应特定事件的时候被程序调用。

为了能被程序识别,回调函数需要具有特定的签名

void onMouse( int event, int x, int y, int flags, void* param);

event 参数是个整数,表示触发回调函数的鼠标事件的类型
x 和 y 是指事件发生时鼠标的位置,用像素坐标表示
flags 表示事件发生时按下了鼠标的哪个键
param 是指向任意对象的指针,作为附带的参数发送给函数

可以用这个方法注册回调函数

setMouseCallback("Original Image",onMouse,reinterpret_cast(&image));

函数 onMouse 与 Original Image 的图像窗口建立了关联,同时把所显示图像的地址作为附加参数传给函数

只要用下面的代码定义回调函数 onMouse, 每当遇到鼠标点击事件时,控制台就会显示对应像素的值

void onMouse( int event, int x, int y, int flags, void* param) { 	Mat *im= reinterpret_cast(param);	switch (event) { // 调度事件 	case EVENT_LBUTTONDOWN: // 鼠标左键按下事件 		// 显示像素值(x,y) 		cout << "at (" << x << "," << y << ") value is: " << static_cast( im->at(cv::Point(x,y))) << std::endl; 		break; 		} }	

OpenCV 还提供了几个用于在图像上绘制形状和写入文本的函数
例如:circle,ellipse,line 和 rectangle

circle(image,Point(115,110),65,0,3)

语法:circle(目标图像,中心点坐标,半径,颜色,厚度)

也可以在图像上写入文本

putText(image,"This is a dog.",Point(40,200),Font_HERSHEY_PLAIN,2.0,255,2);

语法:putText(image,文本,文本坐标,字体类型,字体大小,字体颜色,文本厚度)

这里出现了一个问题,无法显示,发现显示有先后关系,所以代码顺序应该为

namedWindow("opencv test");putText(img, "This is a dog.", Point(40, 200),FONT_HERSHEY_PLAIN, 2.0, 255, 2);circle(img, Point(115, 110), 65, 0, 3);imshow("opencv test", img);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119127.html

相关文章

  • 入门opencv

    摘要:也不知道创始人啥爱好,和都是蟒蛇的意思这里建议除了安装外还应安装读取图片在导入的时候实际上应该是这里的并非代表版本,而是表示我们的是基于,为了保持向后兼容性才这么命名。这个函数的作用其实就是读取每一帧图像。 ...

    maybe_009 评论0 收藏0
  • js中获取昨天今天明天的时间

    摘要:不管是前端还是后台,甚至是数据库中,都会经常频繁的获取各种时间,今天整理了一下在中获取时间,就当作一个笔记记录一下获取昨天时间获取一周前的时间个位数补个,如个位数补个,如获取明天的时间获取今天的时间 不管是前端还是后台,甚至是数据库中,都会经常频繁的获取各种时间,今天整理了一下在javascript中获取时间,就当作一个笔记记录一下-_- var day = new Date(); ...

    sorra 评论0 收藏0
  • Java基础提高

    摘要:获得对象的方法有三种判定指定的对象是否表示一个基本类型。接下来给出的是与其它类相比而言独一无二的特征提供一个默认的无参构造函数。返回对象,表示声明此类型的类或接口。 这是传智张孝祥老师Java高新技术的授课笔记我认为讲的很棒,授课传送门如下:Java高新技术 一、枚举 1.基本应用 public class Test { public static void main(Stri...

    JasinYip 评论0 收藏0
  • Python+OpenCV 图像风格迁移(模仿名画)

    摘要:我最近才发现在的代码中就有图像风格迁移的示例原谅我的后知后觉,是基于论文中的网络模型实现。中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。 现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了 模仿名画风格 的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。 showImg(https:...

    DoINsiSt 评论0 收藏0
  • OpenCV-Python,计算机视觉开发利器

    摘要:而这其中,很多应用都涉及到计算机视觉这样一个细分领域。常见的图像处理灰度图二值化平滑边缘提取这几种都属于数字图像处理的常用方法。对这方面知识感兴趣的,可以找本数字图像处理的相关教材系统地看一遍,了解数字图像处理的基础。 人工智能 ,一个已经被谈论了几十年的概念(最早是 图灵 在 1950年 提出)。如今这几年,相关技术的发展速度是越来越快。高大上如无人驾驶、智能安防、AI辅助诊断,接地...

    阿罗 评论0 收藏0

发表评论

0条评论

layman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<