当前位置: 首页 > 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…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...