当前位置: 首页 > news >正文

【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的方向是往右(为正)。

  pythondata[ 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技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&#xf…...

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视频封面最终版宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#…...

JVM篇之内存及GC

目录一、JVM内存区域1.1程序计数器1.2虚拟机栈1.3本地方法栈1.4堆1.5方法区二、JVM运行时内存2.1新生代(轻量级GC)2.2老年代&#xff08;重量级GC&#xff09;一、JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法栈】、线程共享区域【JAVA 堆、…...

Linux驱动操作地址(寄存器)的一些方式

Linux驱动操作地址(寄存器&#xff09;的一些方式 文章目录Linux驱动操作地址(寄存器&#xff09;的一些方式1.对绝对地址赋值操作2. ioremap2.1 void __iomem *地址2.2 volatile unsigned int *地址2.3 structioremap1.对绝对地址赋值操作 对绝对地址0x100000赋值操作 *&…...

Java日志框架介绍

Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的&#xff0c;现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目&#xff0c;是…...

编程中遇到的计算机大小端概念

概念大小端&#xff08;Endian&#xff09;是指在一个多字节的数据中&#xff0c;字节的存储顺序的规定。通俗来说&#xff0c;就是指数据在计算机内部存储时的顺序问题。在计算机系统中&#xff0c;一个数据项可能占据多个存储单元。在这种情况下&#xff0c;这个数据项的存储…...

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana。新增了一个FlieBeat&#xff0c;它是一个轻量级的日志收集处理工具&#xff0c;FlieBeat占用资源少&#xff0c;适用于在各个服务器上搜集…...

字符函数和字符串函数(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来给大家介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数啦&#xff0c;其实其中有些函数我之前已经学习过了&#xff0c;比如strlen、strcpy&#xff1b;也有一些之前不是很熟悉的函数&#xff0c;比如strstr、strtok…...

九龙证券|下周解禁市值超400亿元,3股解禁压力较大

下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板&#xff0c;至此&#xff0c;百利电气两连板&#xff0c;累计涨幅20.85%。 昨日晚间&#xff0c;百利电气发布股票交易反常动摇公告称&#xff0c;公司不触及“室温超导”相关业务&#xff0c;也未打开相关研发和投入。公…...

一个大型网站架构的演变历程

正序&#xff1a; Rome was not built in a day&#xff08;罗马不是一天建成的。&#xff09;一个成熟的大型网站从来都不是一蹴而就的&#xff0c;需要经过多次架构的调整和升级&#xff0c;我们熟知的大型网站比如京东、淘宝、亚马逊&#xff0c;它们每天都有巨大的用户访问…...

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能&#xff0c;但代码量大&#xff0c;难度大&#xff0c;需要掌握很多底层知识和数学知识 Threej…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...