【OpenCV技能树】——OpenCV基础
前言:
😊😊😊欢迎来到本博客😊😊😊
目前正在进行 OpenCV技能树的学习,OpenCV是学习图像处理理论知识比较好的一个途径,至少比看书本来得实在。本专栏文章主要记录学习OpenCV的过程以及对学习过程的一些反馈记录。感兴趣的同学可以一起学习、一起交流、一起进步。🌟🌟🌟
下面框架图主要是OpenCV入门技能树总共有27个知识点,其中包括了8个大章的学习内容,如果感兴趣的可以进一步学习博主写的关于OpenCV的专栏【通俗易懂OpenCV(C++版)详细教程】:
🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙
文章目录
- 一、OpenCV基础
- 1.1 OpenCV 简介
- 1.2 OpenCV安装(python版)
- 1.3 图像的基本操作
- 1.4 IO与GUI
一、OpenCV基础
1.1 OpenCV 简介
题目:Hello World
以下 Hello World 程序中,能够正确执行下述操作的是?·读取目录下lena图片·显示lena图像窗口·等待用户输入任意按键后关闭窗口·销毁所有窗口
解析:
import cv2
if __name__=='__main__':img = cv2.imread("lena.png")cv2.imshow("lena",img)//名称在前,变量在后cv2.waitKey(0)cv2.destroyAllWindows()
1.2 OpenCV安装(python版)
题目:极简OpenCV环境安装
·OpenCV 的官方教程里提供了各平台的安装教程:https://docs.opencv.org/4.x/df/d65/tutorial_table_of_content_introduction.html
·但是最便利的方式是安装 opencv-python ,安装命令如下:pip install opencv-python
·在 Python 中打印出使用的 OpenCV 版本,正确的代码是?
解析:
import cv2
print(cv2.__version__)
1.3 图像的基本操作
1、题目:图像像素颜色
·认识颜色空间,OpenCV 常用的颜色空间有:RGB颜色空间、HSV颜色空间、Lab颜色空间。
·以下选项中【不正确】打印像素(100,100)处颜色空间分量名字的是?
解析:
import numpy as np
import cv2 as cv
if name == 'main':img = cv.imread('lena.png', cv.IMREAD_COLOR)px = img[100, 100]print(f'red:{px[0]}, green:{px[0]}, blue:{px[0]}')//这行代码有误
OpenCV读图片默认通道是排列BGR
2、题目:图片黑客帝国化
·黑客帝国的图片风格偏绿色,任意图片的每个像素(r,g,b)经过公式转换后即可获得一张“黑客帝国风格图片”:r = r^(3/2) g = r^(4/5)b = r^(3/2)
·我们对lena图片也做黑客帝国风格化处理:
·框架代码如下:
import numpy as np
import cv2
import mathdef hacker(img):# TODO(You): 请在此添加代码if __name__ == '__main__':img_origin = cv2.imread('lena.png', cv2.IMREAD_COLOR)img = cv2.imread('lena.png', cv2.IMREAD_COLOR)print(img.size)print(img.shape)hacker(img)print('显示图片,请按任意键退出')numpy_horizontal_concat = np.concatenate((img_origin, img), axis=1)cv2.imshow('Lena图片黑客帝国化', numpy_horizontal_concat)cv2.waitKey()cv2.destroyAllWindows()
·以下选项是对函数 def hacker(img) 的实现,请选出实现【有错】的选项:
解析:
def hacker(img):
height, width, channels = img.shape
for i in range(0, width):for j in range(0, height):b, g, r = img.item((i, j))hack_b = int(math.pow(b/256.0, 3/2) * 256)hack_g = int(math.pow(g/256.0, 4/5) * 256)hack_r = int(math.pow(r/256.0, 3/2) * 256)img.itemset((i, j), (hack_b, hack_g, hack_r))
另: item和itemset函数区别
3、题目:梅西足球轨迹
使用 OpenCV 可以方便的剪切粘贴图像上的区域。例如下图是梅西在踢足球:
实现代码如下,需要补全TODO部分:
import cv2
import numpy as npif __name__ == '__main__':img = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)start = [493, 594]end = [112, 213]ball = img[start[0]:start[1], end[0]:end[1]]x_step = 101y_step = 10for i in range(-1, 4):# TODO(You): 请在此实现代码cv2.imshow("ball_continue", img)cv2.waitKey(0)cv2.destroyAllWindows()
解析:
x_offset = x_stepi
y_offset = y_stepi
img[start[0]-y_offset:start[1]-y_offset, end[0]+x_offset:end[1]+x_offset] = ball
注意:图像中,一般情况下左上角为坐标轴的(0,0)点,X是水平方向(往右为正,往左为负),Y是竖直方向(往下为正,往上为负)。值得注意的是,起点图片是图二左下角第一哥足球,并非图一的原始足球位置。
从图中可以看出足球轨迹,在Y的方向是往上(为负),在X的方向是往右(为正)。
python
中data[ 1 : 10, 2:30 ]
中 :是表示一个序列,逗号前 1:10表示X的范围从1到10, 2:30表示Y的范围是2到30;
x_step
所在的线是平行于X轴的水平线;
y_step
所在的直线是平行于Y轴的竖直线;
所以,x_step是Y方向上的增加量;y_step是X方向上的增加量;足球轨迹在Y的方向是往上(为负),即start[0]-y_offset:start[1]-y_offset
,在X的方向是往右(为正),即end[0]+x_offset:end[1]+x_offset
。
1.4 IO与GUI
1、题目:甲壳虫乐队
一只甲壳虫想组个乐队,但是临时找不到队友。
请使用 OpenCV 读取下面的彩色甲壳虫图片 'bug.jpg',帮助他变身灰色甲壳虫,然后完成组队。
显示甲壳虫乐队并写入到 'bug_band.jpg',以下实现正确的是?
解析:
import numpy as np
import cv2if name == 'main':bug_img = cv2.imread("bug.jpg") #读取图像'''将彩色三通道转换为单通道的灰度图,其转换原理为: GRAY = B * 0.114 + G * 0.587 + R * 0.299'''bug_img_gray = cv2.cvtColor(bug_img, cv2.COLOR_BGR2GRAY)'''COLOR_GRAY2BGR 将单通道的灰度图转换为三通道,这是为了后面的图像合并。COLOR_GRAY2BGR的原理:R = G = B = GRAY; A = 0; R,G,B相等时,图像会显示为灰值,不相等时颜色会偏向于较大的基色;'''bug_img_gray_by_BGR_space = cv2.cvtColor(bug_img_gray, cv2.COLOR_GRAY2BGR)''' concatenate 合并两副图像,要求两幅图像大小一致,通道一致。连接方向(轴向),axis=0时,垂直连接;axis=1时,水平连接;axis=None时,扁平输出,即把二维矩阵中的每个元素横向顺序依次放到一个一维矩阵(列表)中'''bug_img_concat = np.concatenate( (bug_img, bug_img_gray_by_BGR_space),axis=1)cv2.imwrite("bug_band.jpg", bug_img_concat)cv2.imshow('甲壳虫乐队', bug_img_concat)cv2.waitKey(0)cv2.destroyAllWindows()
2、题目:早起的鸟儿有虫吃
早起的鸟儿不但有虫吃,还可以照镜子。请你帮助鸟儿们跟镜像合影。
这是跟镜像合影的效果:
基本的实现代码如下,合影每10帧采样一次:
import numpy as np
import cv2if __name__ == '__main__':cap = cv2.VideoCapture('birds.mp4')out = ...# TODO(You): 请在此正确创建待保存的目标mp4文件`out`i = 0while(cap.isOpened()):ret, bird_frame = cap.read()if bird_frame is None:breakbird_flip_frame = cv2.flip(bird_frame, 0)bird_concat_frame = np.concatenate((bird_frame, bird_flip_frame),axis=1)cv2.imshow('bird_concat_frame', bird_concat_frame)if i % 10 == 0:out.write(bird_concat_frame)i += 1if cv2.waitKey(1) & 0xFF == ord('q'):breakout.release()cap.release()cv2.destroyAllWindows()
解析:
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter(
'birds_concat.mp4',
cv2.VideoWriter_fourcc('mp4v'),fps,(width2, height))
3、题目:甲壳虫的Base64之旅
如下的一只甲壳虫,我们希望把它编码成 Base64,再从Base64解码出来。代码框架如下:
以下对两个函数实现正确的是?
import numpy as np
import cv2
import base64def img_to_base64(img):# TODO(You):def img_from_base64(img_base64):# TODO(You):if __name__ == '__main__':img = cv2.imread('bug.jpg')img_base64 = img_to_base64(img)img = img_from_base64(img_base64)cv2.imshow('img_decode', img)cv2.waitKey()cv2.destroyAllWindows()
解析:
def img_to_base64(img):return base64.b64encode(cv2.imencode('.jpg', img)[1]).decode()def img_from_base64(img_base64):jpg_original = base64.b64decode(img_base64)jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)img = cv2.imdecode(jpg_as_np, flags=1)return img
4、题目:矩形涂鸦画板
编写一个矩形涂鸦画板,实现功能:·鼠标左键按下拖动绘制矩形,鼠标左键弹起时完成绘制·按'c'键清空画板·按'ESC'键退出
基本框架代码如下:
import numpy as np
import cv2 as cv
from random import randintclass Painter:def __init__(self) -> None:self.mouse_is_pressed = Falseself.last_pos = (-1, -1)self.width = 300self.height = 512self.img = np.zeros((self.width, self.height, 3), np.uint8)self.window_name = 'painter'self.color = Nonedef run(self):print('画板,拖动鼠标绘制矩形框,按ESC退出,按c键清空画板')cv.namedWindow(self.window_name)cv.setMouseCallback(self.window_name,lambda event, x, y, flags, param: self.on_draw(event, x, y, flags, param))while True:cv.imshow(self.window_name, self.img)k = cv.waitKey(1) & 0xFFif k == ord('c'):self.clean()elif k == 27:breakcv.destroyAllWindows()def on_draw(self, event, x, y, flags, param):# TODO(You): 请正确实现画板事件响应,完成功能def clean(self):cv.rectangle(self.img, (0, 0), (self.height, self.width), (0, 0, 0), -1)def begin_draw_rectangle(self, pos1, pos2):if self.color is None:self.color = (randint(0, 256), randint(0, 256), randint(0, 256))cv.rectangle(self.img, pos1, pos2, self.color, -1)def end_draw_rectangle(self, pos1, pos2):self.color = Noneif __name__ == '__main__':p = Painter()p.run()
以下正确实现鼠标事件,完成画板绘制逻辑的代码是?
解析:
pos = (x, y)
if event == cv.EVENT_LBUTTONDOWN:self.mouse_is_pressed = Trueself.last_pos = pos
elif event == cv.EVENT_MOUSEMOVE:if self.mouse_is_pressed == True:self.begin_draw_rectangle(self.last_pos, pos)
elif event == cv.EVENT_LBUTTONUP:self.end_draw_rectangle(self.last_pos, pos)self.mouse_is_pressed = False
注意:使用变量mouse_is_pressed
去控制,鼠标按下为mouse_is_pressed = true
;鼠标移动时当mouse_is_pressed==true
时才会绘制;当鼠标抬起时,mouse_is_pressed = false
停止绘制。
相关文章:
【OpenCV技能树】——OpenCV基础
前言: 😊😊😊欢迎来到本博客😊😊😊 目前正在进行 OpenCV技能树的学习,OpenCV是学习图像处理理论知识比较好的一个途径,至少比看书本来得实在。本专栏文章主要记录学习Op…...
人体姿态识别
自留记录论文阅读,希望能了解我方向的邻域前沿吧 粗读,持续更新 第一篇 ATTEND TO WHO YOU ARE: SUPERVISING SELF-ATTENTION FOR KEYPOINT DETECTION AND INSTANCE-AWARE ASSOCIATION 翻译:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.5352&…...
ubuntu下调试驱动
使用 Ubuntu Linux 测试 Linux 驱动 1. 测试 Linux 驱动准备工作 对于一个 Linux 驱动程序,一开始可以在 Ubuntu Linux 上做前期开发和测试。对于访问硬件部分也可以在 Ubuntu Linux 用软件进行模拟,切记不能代替真实的环境!当基本开发完成后&#…...
第十四届蓝桥杯三月真题刷题训练——第 9 天
第 1 题:找素数 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 素数就是不能再进行等分的整数。比如:7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的…...
操作系统复习
熟练掌握操作系统的定义,操作系统的特征,操作系统的功能熟练掌握多道程序设计的概念,单道程序设计和多道程序设计的区别,多道程序设计的优点熟悉操作系统接口的主要功能,系统调用的基本概念、类型、实现。操作系统接口…...
springboot健身房管理系统
springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍…...
C语言学习笔记——数组
前言 数组是C语言中的一种自定义数据类型,它的使用非常广泛。但是很多新手在使用数组时,经常在一些细节上出问题,导致程序崩溃或者无法编译。今天,我就来详细聊聊数组的使用和我注意到的一些细节。 一、常见的数组类型与数组的创建…...
类和对象 - 中
本文已收录至《C语言》专栏! 作者:ARMCSKGT 目录 前言 正文 构造函数 对比C和C的初始化 构造函数的使用与特性 默认构造函数 C11关于默认构造缺陷的补丁 析构函数 析构函数特性 默认析构和自定义析构 拷贝构造函数 问题聚焦 拷贝构造的定…...
Android之屏幕适配方案
在说明适配方案之前,我们需要对如下几个概念有所了解:屏幕尺寸,屏幕分辨率,屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度,单位是英寸,1英寸2.54厘米。 比如常见的屏幕尺寸:5.0、5…...
SpringBoot+jersey跨域文件上传
一、配置tomcat服务器 1.1、添加upload文件夹 在webapps\Root文件夹下创建用于接收上传文件的upload文件夹 1.2、修改conf\web.xml设置允许上传文件 <init-param><param-name>readonly</param-name><param-value>false</param-value></ini…...
数据结构One——绪论
本喵是FW视频封面最终版宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵&#…...
JVM篇之内存及GC
目录一、JVM内存区域1.1程序计数器1.2虚拟机栈1.3本地方法栈1.4堆1.5方法区二、JVM运行时内存2.1新生代(轻量级GC)2.2老年代(重量级GC)一、JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法栈】、线程共享区域【JAVA 堆、…...
Linux驱动操作地址(寄存器)的一些方式
Linux驱动操作地址(寄存器)的一些方式 文章目录Linux驱动操作地址(寄存器)的一些方式1.对绝对地址赋值操作2. ioremap2.1 void __iomem *地址2.2 volatile unsigned int *地址2.3 structioremap1.对绝对地址赋值操作 对绝对地址0x100000赋值操作 *&…...
Java日志框架介绍
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目,是…...
编程中遇到的计算机大小端概念
概念大小端(Endian)是指在一个多字节的数据中,字节的存储顺序的规定。通俗来说,就是指数据在计算机内部存储时的顺序问题。在计算机系统中,一个数据项可能占据多个存储单元。在这种情况下,这个数据项的存储…...
日志与可视化方案:从ELK到EFK,再到ClickHouse
EFK方案 从ELK谈起 ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana。新增了一个FlieBeat,它是一个轻量级的日志收集处理工具,FlieBeat占用资源少,适用于在各个服务器上搜集…...
字符函数和字符串函数(上)——“C”
各位CSDN的uu们你们好呀,今天小雅兰来给大家介绍一个全新的知识点,就是字符函数和字符串函数啦,其实其中有些函数我之前已经学习过了,比如strlen、strcpy;也有一些之前不是很熟悉的函数,比如strstr、strtok…...
九龙证券|下周解禁市值超400亿元,3股解禁压力较大
下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板,至此,百利电气两连板,累计涨幅20.85%。 昨日晚间,百利电气发布股票交易反常动摇公告称,公司不触及“室温超导”相关业务,也未打开相关研发和投入。公…...
一个大型网站架构的演变历程
正序: Rome was not built in a day(罗马不是一天建成的。)一个成熟的大型网站从来都不是一蹴而就的,需要经过多次架构的调整和升级,我们熟知的大型网站比如京东、淘宝、亚马逊,它们每天都有巨大的用户访问…...
前端前沿web 3d可视化技术 ThreeJS学习全记录
前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能,但代码量大,难度大,需要掌握很多底层知识和数学知识 Threej…...
链表经典笔试题(LeetCode刷题)
本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳,希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...
SpringCloud五大组件
微服务SpringCloud整合技术组件基本流程: 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心,分为Eure…...
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
Echart? ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 ECharts 遵循 Apache-2.0 开源协议,免费商用。 ECharts 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome…...
聊聊腾讯T13技术专家被开除
这两天腾讯的技术大佬stonehuang被曝离开腾讯,据他老婆在小红书上发的帖子称是遭遇了裁员,说实话刚看到这个消息我挺震惊的,stonehuang在中国大前端领域是排得上号的专家,同时他2005年就加入了腾讯,在qq空间的发展历程…...
c++ 常见宏、模板用法【1】
目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...
【25】Verilog进阶 - 序列检测
VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...
如何绕开运营商的 QoS 限制
运营商针对 UDP 进行限制,这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一,上了线很多问题,丢包,慢等的问题严重增加运维,运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则,只要换一个端口就可…...
C#基础教程22 异常处理
文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...
java八股文--java基础
java基础1.什么是面向对象,谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第四套解析(详细)
2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (4) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...
如何做网站稳定客户/武汉seo公司排名
Python 多进程默认不能共享全局变量主进程与子进程是并发执行的,进程之间默认是不能共享全局变量的(子进程不能改变主进程中全局变量的值)。如果要共享全局变量需要用(multiprocessing.Value("d",10.0),数值)(multiprocessing.Array("i&q…...
开封旅游网站建设网页推广/seo关键字排名优化
上一节中我们已经基本完成了django项目部署到nginx,这一节我们将http改为https,提升访问的安全性。 我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流࿰…...
网站开发的语言有什么/新闻平台发布
Abby: 娇小可爱的女人,文静,令人喜爱,个性甜美。 Aimee: 意为可爱的人。 Alisa: 快乐的姑娘的意思。 Angelia: 天使,传送讯息者。Angelia被描绘为美丽,娇小的女子若不是有著甜美温柔的个性,即是活泼莽撞的女…...
网站怎么做架构图/引擎优化
前言 这个话题已经是老生常谈了,之所以又被我拎出来,是因为博主隔壁的一个童鞋最近写了一篇叫做《ThreadLocal内存泄露》的文章,我就不上链接了,因为写的实在是。。(省略一万字) 重点是写完后,还…...
南昌网站快速排名提升/网络平台建站
PasswordStrength是AtlasControlToolkit在最新版本里面提供的一个检测密码强度的Extender,它支持两种文本提示和进度条提示两种方式。主要内容1.PasswordStrength介绍2.完整示例一.PasswordStrength介绍PasswordStrength是AtlasCo…...
flash网站的优点和缺点/深圳优化公司
python脚本为敏捷开发脚本,在zabbix监控也起到重要作用,以下是使用python脚本发送告警邮件配置方法。 脚本如下: #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText import sys mail_host = smtp.126.com mail_user = username mail…...