opencv python笔记

OpenCV课程

OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。

  • OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库
  • OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持
  • OpenCV可用于开发实时的图像处理,计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时。

opencv重要性

  • 计算机视觉:OpenCV 是计算机视觉领域的标准库之一,广泛应用于图像识别、物体检测、人脸识别、手势识别等。

  • 机器人技术:在机器人导航、环境感知和交互中,OpenCV 用于处理传感器数据和视觉信息。

  • 医学影像:在医学影像分析中,OpenCV 用于图像增强、分割和特征提取。

  • 自动驾驶:在自动驾驶汽车中,OpenCV 用于环境感知、障碍物检测和车道线识别。

  • 安全监控:在安全监控系统中,OpenCV 用于运动检测、人脸识别和行为分析。

    学习 OpenCV 不仅可以提升你的技术能力,还能为你在计算机视觉和图像处理领域的发展打开更多的门路。无论是学术研究、工业应用还是个人项目,OpenCV 都是一个不可或缺的工具

环境安装

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

显示窗口

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时

函数原型

cv2.namedWindow(winname, flags=None)

参数说明

  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。

  • flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为

    cv2.WINDOW_AUTOSIZE
    

    。常见的标志包括:

    • cv2.WINDOW_NORMAL: 允许调整窗口大小。
    • cv2.WINDOW_AUTOSIZE: 窗口大小根据图像大小自动调整,不能手动调整。。

示例

以下是一个简单的示例,展示如何使用 cv2.namedWindow 创建一个窗口并在其中显示图像:

import cv2# 读取图像
image = cv2.imread('images/car.png')# 创建一个名为 "Image Window" 的窗口,允许调整大小
cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)#2 设置名字和窗口大小
cv2.resizeWindow("Image Window",500,300)
# 显示图像
cv2.imshow('Image Window', image)# 等待用户按键
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()

详细解释

  1. 读取图像

    image = cv2.imread('path/to/your/image.jpg')
    

    使用 cv2.imread 函数读取图像文件。

  2. 创建窗口

    cv2.namedWindow('Image Window', cv2.WINDOW_NORMAL)
    

    使用 cv2.namedWindow 创建一个名为 “Image Window” 的窗口,并设置标志为 cv2.WINDOW_NORMAL,允许用户调整窗口大小。

  3. 显示图像

    cv2.imshow('Image Window', image)
    

    使用 cv2.imshow 在指定的窗口中显示图像。

  4. 等待用户按键

    cv2.waitKey(0)
    

    使用 cv2.waitKey 暂停程序执行,等待用户按键。参数 0 表示无限期等待,直到有按键事件发生。

    返回值:是一个ASCII值,

    例如:q 键 ASCII 值为 113 ESC 键是27

  5. 关闭所有窗口

    cv2.destroyAllWindows()
    

    使用 cv2.destroyAllWindows 关闭所有打开的窗口。

其他注意事项

  • 窗口名称:窗口名称必须是唯一的,否则会覆盖已有的同名窗口。
  • 窗口标志:选择合适的窗口标志可以提升用户体验,特别是在需要用户交互的场景中。

创建空白图像

你可以使用 np.zeros 函数创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数(例如,对于 RGB 图像,形状应为 (height, width, 3)

函数写法

# 创建一个 500x500 像素的空白图像,3 个通道(RGB)
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)

案例:

import cv2
import numpy as np# 创建一个 500x500 像素的空白图像,3 个通道(RGB)
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)# 显示空白图像
cv2.imshow('Image', blank_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存图片

``cv2.imwrite` 是 OpenCV 库中的一个函数,用于将图像保存到文件中。这个函数在图像处理和计算机视觉任务中非常常用,特别是在需要将处理后的图像结果保存到磁盘时。

函数原型

cv2.imwrite(filename, img[, params])

参数说明

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .jpg, .png, .bmp, .tiff 等。
  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。

返回值

  • bool: 成功保存图像返回 True,否则返回 False

示例

以下是一个简单的示例,展示如何使用 cv2.imwrite 将图像保存到文件中:

import cv2# 读取图片
img = cv2.imread("images/car.png")
# 保存图片
rs = cv2.imwrite("save_image/car.png", img)
if rs:print("图像保存成功!")
else:print("图像保存失败!")

其他注意事项

  • 文件路径:确保提供的文件路径是有效的,如果路径不存在,OpenCV 会尝试创建它,但如果权限不足则会保存失败。

图像切片(裁剪)

在 OpenCV 中,图像切片用于从图像中提取一个子区域(矩形区域)。这种操作在图像处理中非常常见,特别是在进行目标检测、ROI(Region of Interest,感兴趣区域)提取等任务时。

语法解释

假设你有一个图像 img,它的类型是 numpy.ndarrayimg[y:y+h, x:x+w] 的含义如下:

  • x: 子区域左上角的 x 坐标。
  • y: 子区域左上角的 y 坐标。
  • w: 子区域的宽度。
  • h: 子区域的高度。

切片操作

  • img[y:y+h, x:x+w] 提取的是从 (x, y) 开始,宽度为 w,高度为 h 的矩形区域。

示例

假设你有一个图像 img,并且你想要从这个图像中提取一个特定的矩形区域,例如左上角坐标为 (50, 60),宽度为 100,高度为 150 的区域。

import cv2# 读取图像
img = cv2.imread('input_image.jpg')# 定义矩形区域的参数
x, y, w, h = 50, 60, 100, 150# 提取子区域
roi = img[y:y+h, x:x+w]# 显示原始图像和提取的子区域
cv2.imshow('Image', img)
cv2.imshow('ROI', roi)# 等待用户按键
cv2.waitKey(0)# 关闭所有窗口
cv2.destroyAllWindows()

原图片:
在这里插入图片描述

剪切后(注:以下的图片示例的x,y等参数与代码示例不同):
在这里插入图片描述

其他注意事项

  • 边界检查:确保 (x, y)(x+w, y+h) 都在图像的边界内,否则会导致数组索引越界错误。
  • 数据类型img 通常是 numpy.ndarray 类型,切片操作返回的也是 numpy.ndarray 类型。

调整图片大小

cv2.resize 是 OpenCV 库中的一个函数,用于调整图像的大小。这个函数在图像处理中非常常用,特别是在需要对图像进行缩放、放大或缩小以适应不同需求时。

函数原型

cv2.resize(src, dsize, dst)

参数说明

  • src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。
  • dsize (tuple): 输出图像的尺寸,是一个二元组 (width, height)。如果指定了 fxfy,则可以忽略此参数。

返回值

  • dst (numpy.ndarray): 缩放后的图像。

示例

以下是一个简单的示例,展示如何使用 cv2.resize 调整图像的大小:

import cv2img = cv2.imread("images/car.png")
#获取图片的像素和通道数
height, width, channels = img.shape
print(f"高度:{height},宽度:{width},通道数:{channels}")
#调整图片的大小
img = cv2.resize(img, (300, 300))
height, width, channels = img.shape
print(f"调整后:高度:{height},宽度:{width},通道数:{channels}")
#保存图片
cv2.imwrite("save_image/car.png", img)

在这里插入图片描述

图像绘制

绘制圆形

cv2.circle()函数用于在图像上绘制圆形。该函数的语法如下:

cv2.circle(img, center, radius, color, thickness)

其中,参数解释如下:

  • img:要绘制圆形的图像。

  • center:圆心的坐标。

  • radius:圆的半径。

  • color:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

  • thickness:圆的边界线条的厚度,如果为负值或cv2.FILLED,表示填充整个圆。

    案例

#绘制圆形
def test10():img = cv2.imread("../images/car.png")# 绘制圆形center = (300, 200)  # 圆心坐标radius = 50  # 半径color = (0, 255, 0)  # 颜色为绿色thickness = 5  # 线条厚度cv2.circle(img, center, radius, color, thickness)# 显示带有圆形的图像cv2.imshow('Circle', img)cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述

绘制矩形

cv2.rectangle()`函数用于在图像上绘制矩形。该函数的语法如下:

 cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

其中,参数解释如下:

  • img:要绘制矩形的图像。
  • pt1:矩形的一个顶点。
  • pt2:矩形对角线上的另一个顶点。
  • color:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。
  • thickness:矩形边框的厚度,如果为负值或cv2.FILLED,表示填充整个矩形内部。
#绘制图片-矩形
def test09():img = cv2.imread("../images/car.png")# 绘制矩形leftTop = (100, 100)  # 左上角顶点rightFoot= (300, 200)  # 右下角顶点color = (0, 255, 0)  # 颜色为绿色width = 2  # 线条厚度cv2.rectangle(img, leftTop, rightFoot, color, width)# 显示带有矩形的图像cv2.imshow('Rectangle', img)cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述

绘制文本

cv2.putText 是 OpenCV 库中的一个函数,用于在图像上添加文本。这个函数在图像处理和计算机视觉任务中非常有用,特别是在需要标注图像、显示信息或调试时。

函数原型

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

参数说明

  • img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。

  • text (str): 要添加的文本字符串。

  • org (tuple): 文本的起始位置,是一个二元组 (x, y),表示文本左下角的坐标。

  • fontFace

    (int): 字体类型,常见的字体类型包括:

    • cv2.FONT_HERSHEY_SIMPLEX: 正常大小的无衬线字体
    • cv2.FONT_HERSHEY_PLAIN: 小号的无衬线字体
    • cv2.FONT_HERSHEY_DUPLEX: 正常大小的无衬线字体,比 FONT_HERSHEY_SIMPLEX 更粗
    • cv2.FONT_HERSHEY_COMPLEX: 正常大小的有衬线字体
    • cv2.FONT_HERSHEY_TRIPLEX: 正常大小的有衬线字体,比 FONT_HERSHEY_COMPLEX 更粗
    • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 手写风格的字体
    • cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 手写风格的字体,比 FONT_HERSHEY_SCRIPT_SIMPLEX 更粗
    • cv2.FONT_ITALIC: 斜体修饰符,可以与其他字体类型组合使用
  • fontScale (float): 字体大小的比例因子。

  • color (tuple): 文本颜色,是一个三元组 (B, G, R),表示蓝色、绿色和红色的值。

  • thickness (int, 可选): 文本线条的厚度,默认值为 1。

  • lineType

    (int, 可选): 线条类型,常见的线条类型包括:

    • cv2.LINE_4: 4 连通线
    • cv2.LINE_8: 8 连通线
    • cv2.LINE_AA: 抗锯齿线(默认值)

返回值

  • img (numpy.ndarray): 添加文本后的图像。

示例

以下是一个简单的示例,展示如何使用 cv2.putText 在图像上添加文本:

import cv2
import numpy as npimage = cv2.imread("images/car.png")# 定义文本内容和位置
text = "hello world!"
# 文本的左下角位置
position = (50, 200)
# 设置字体类型
font = cv2.FONT_HERSHEY_SIMPLEX
#字体大小
font_scale = 1
#字体颜色
font_color = (0, 255, 0)  
#字体线条的粗细
line_type = 2# 在图像上绘制文本
cv2.putText(image, text, position, font, font_scale, font_color, line_type)
# 显示图像
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存图像(可选)
cv2.imwrite('output_image.png', image)

在这里插入图片描述

绘制直线

cv2.line(img, pt1, pt2, color, thickness lineType) -> img

参数说明

  • img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。

  • pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 (255, 0, 0) 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。

  • thickness: 可选参数,定义直线的宽度。默认值是 1。

返回值

  • img: 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

cv2.line() 是 OpenCV 库中的一个函数,用于在图像上绘制直线。这个函数非常直观,它接受多个参数来定义直线的位置、颜色、厚度等属性。以下是 cv2.line() 函数的基本语法及其参数说明

import cv2img = cv2.imread("images/car.png")# 定义直线的起点和终点
start_point = (50, 50)  # 起点坐标 (x1, y1)
end_point = (450, 450)  # 终点坐标 (x2, y2)# 定义颜色 (B, G, R) 和线条粗细
color = (255, 0, 0)  # 蓝色
thickness = 2  # 线条的宽度# 使用 cv2.line() 在图像上绘制直线
cv2.line(img, start_point, end_point, color, thickness)# 显示图像
cv2.imshow('Image with Line', img)# 等待按键,然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

控制鼠标

cv2.setMouseCallback 是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。

案例:

import cv2
#创建鼠标回调函数
def draw_test(event,x,y,flag,param):print(x,y)
img =  cv2.imread('images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
cv2.imshow('image', img)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解释

  1. draw_test函数:
    • event: 鼠标事件类型,如 cv2.EVENT_LBUTTONDOWN 表示左键按下。
    • x, y: 鼠标事件发生时的坐标。
    • flags: 额外的标志位,通常不用。
    • param: 传递给回调函数的参数,通常不用。

cv2.setMouseCallback('image', draw_test) 设置鼠标回调函数,当在 ‘image’ 窗口中发生鼠标事件时,调用 draw_circle 函数

案例:在图像上绘制圆形

import cv2
import numpy as np#创建鼠标回调函数
def draw_test(event,x,y,flag,param):global drawing# cv2.EVENT_LBUTTONDOWN  鼠键左键按下事件if event == cv2.EVENT_LBUTTONDOWN:drawing = True# cv2.EVENT_MOUSEMOVE  鼠键左键移动事件elif event == cv2.EVENT_MOUSEMOVE:if drawing:cv2.circle(img,(x,y),15,(255,0,0),-1)#cv2.EVENT_LBUTTONUP  鼠键左键释放事件elif event == cv2.EVENT_LBUTTONUP:drawing = Falsecv2.circle(img, (x, y), 15, (255, 0, 0), -1)img= cv2.imread('../images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
# 真正的标志,表示是否正在绘制
drawing = False
#永真循环,图像被绘制后显示图片,直到按下ESC键退出
while(True):cv2.imshow('image', img)if cv2.waitKey(20) == 27:  # 按ESC退出break
cv2.destroyAllWindows()

在这里插入图片描述

视频处理

cv2.VideoCapture 是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。

常用方法

  1. read()

read() 方法用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。

ret, frame = cap.read()
if not ret:print("Failed to grab frame")break
  1. release()

release() 方法用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。

cap.release()
  1. isOpened()

isOpened() 方法用于检查视频捕获对象是否已经成功打开。

if not cap.isOpened():print("Error opening video stream or file")
  1. get()set()

get()set() 方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。

# 获取帧宽
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)# 获取帧高
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)# 设置帧宽
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)# 设置帧高
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

案例

import cv2# 打开视频文件或摄像头
# 使用 0 打开默认摄像头,或者替换为视频文件路径,例如 'video.mp4'
video_capture = cv2.VideoCapture('video/1.mp4')  # 0 表示使用摄像头
if not video_capture.isOpened():print("视频没有打开")exit()
# 获取视频的帧率
fps = video_capture.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps)  # 计算帧间延迟
while True:# 逐帧读取视频ret, frame = video_capture.read()# 显示当前帧cv2.imshow('Video', frame)# 按下 'q' 键退出if cv2.waitKey(delay) & 0xFF == ord('q'):break
# 释放视频捕获对象和关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()

关于opencv 显示中文乱码问题解决

​ 在使用 OpenCV 的 cv2.putText 函数添加中文时,可能会遇到显示乱码的问题。这是因为 OpenCV 默认使用的字体不支持中文字符。为了在图像上正确显示中文,可以使用 PIL(Pillow)库来处理文本,然后将文本渲染到图像上

1 确保你已经安装了 opencv-pythonPillow 库。如果没有安装,可以通过 pip 安装:

注意:如果用的Anaconda ,是包含了这个库,可以不安装

pip install opencv-python pillow

2 下载一个中文字体文件,常见的中文字体文件有 simhei.ttfsimsun.ttc 等。你可以从系统中找到这些字体文件,或者从互联网下载。

3 定义 put_text 函数

def put_text(image, text, position, font_path, font_size, color):# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(pil_image)# 加载字体font = ImageFont.truetype(font_path, font_size)# 在图像上绘制文本draw.text(position, text, fill=color, font=font)# 将 PIL 图像转换回 OpenCV 图像image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return image_with_text

4 案例

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as npdef put_text(image, text, position, font_path, font_size, color):# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(pil_image)# 加载字体font = ImageFont.truetype(font_path, font_size)# 在图像上绘制文本draw.text(position, text, fill=color, font=font)# 将 PIL 图像转换回 OpenCV 图像image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return image_with_text# 读取图像
image = cv2.imread('images/car.png')# 定义文本内容、位置、字体路径、字体大小和颜色
text = "你好,世界!"
position = (50, 50)
font_path = "myfont/simhei.ttf"    # 替换为你的字体文件路径
font_size = 30
color = (0, 0, 255)  # BGR 格式# 在图像上添加中文文本
image_with_text = put_text(image, text, position, font_path, font_size, color)# 显示图像
cv2.imshow('Image with Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()

课后作业

1.为视频或摄像头添加文字“ XXXX”及点击增加数量的功能。
例如:“收获火箭数量:1” 点击视频窗口一次 “收获火箭数量:2”

2.实现在图片上绘制的功能,并将绘制后的图像按键保存到本地

作业一:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont# cap = cv2.VideoCapture("video/yuntu.mp4")cap = cv2.VideoCapture(0)text2 = 0
def mytest(event, x, y, flags, param):global text2if event == cv2.EVENT_LBUTTONDOWN:text2 +=1def put_text(image, text, org, font_path, font_size, color):# 将 OpenCV 图像转换为 PIL 图像pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(pil_image)# 加载字体font = ImageFont.truetype(font_path, font_size)# 绘制文本draw.text(org, text, fill=color, font=font)# 将 PIL 图像转换回 OpenCV 图像image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return image_with_text
cv2.namedWindow('frame')  # 创建一个名为 'frame' 的窗口
cv2.setMouseCallback('frame',mytest)while True:ret, frame = cap.read()if not ret:break# 定义字体文本内容# text = "hello OpenCV"text = "火箭数:"+str(text2)# 定义起始坐标org = (50, 100)# 定义字体路径# font = cv2.FONT_HERSHEY_SIMPLEXfont_path = 'fontface/simhei.ttf'# 定义字体大小font_size = 40# 定义字体颜色color = (255, 0, 0)  # BGR 格式# 绘制文字# c_text = cv2.putText(img, text=text, org=org, fontFace=font, fontScale=size, color=color, thickness=thickness)c_img = put_text(frame, text, org, font_path, font_size, color)cv2.imshow('frame', c_img)if cv2.waitKey(5) == 27:breakcv2.destroyAllWindows()
cap.release()

现成的视频就这一个,翻出来个之前游戏的视频,现在没在玩了
在这里插入图片描述

在这里插入图片描述
作业二:

import cv2
d = False
def mytest(event,x,y,flags,param):global dif event == cv2.EVENT_LBUTTONDOWN:print(x,y,"按下")# cv2.circle(img,(x,y),2,(0,0,255),2)d = Trueelif event == cv2.EVENT_LBUTTONUP:print(x, y, "抬起")# cv2.circle(img, (x, y), 2, (0, 0, 255), 2)d = Falseelif event == cv2.EVENT_MOUSEMOVE:print(x, y, "移动")if d:cv2.circle(img, (x, y), 2, (0, 0, 255), 2)
img = cv2.imread("images/car.png")
cv2.namedWindow("image")
cv2.setMouseCallback('image',mytest)
while(1):cv2.imshow("image",img)# 等待用户按下 ESC 键时退出程序if cv2.waitKey(20) == 27:breakelif cv2.waitKey(20) == ord('q'):#按下q键时退出程序cv2.imwrite("save_image/car_circle.png",img)#保存图片breakcv2.destroyAllWindows()

码是一张张涂的所以不一样
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464081.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 力扣 - 2461. 长度为 K 子数组中的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口,用一个哈希表记录窗口内的所有元素(用来对窗口内元素去重),我们取哈希表中元素数量等于k的窗口总和的最大值 题解代码 use std::collecti…

[实战-11] FlinkSql 设置时区对TIMESTAMP和TIMESTAMP_LTZ的影响

table.local-time-zone table.local-time-zoneDataStream-to-Table Conversion(拓展知识)代码测试flinksql代码执行结果截图1. Asia/Shanghai 结果如下2. UTC结果如下 table.local-time-zone table.local-time-zone可用于设置flinksql的时区。 flink的内…

rnn/lstm 项目实战

tip:本项目用到的数据和代码在https://pan.baidu.com/s/1Cw6OSSWJevSv7T1ouk4B6Q?pwdz6w2 1. RNN : 预测股价 任务:基于zgpa_train.csv数据,建立RNN模型,预测股价 1.完成数据预处理,将序列数据转化为可用于RNN输入的数据 2.对新数据zgpa_test.csv进…

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10: 这个语句的意思是,从查询结果中跳过前100000条记录,然后返回接下来的10条记录。这通常用于分页查询中,当你需要跳过大量的记录以获取后续的记录时。例如,如果你…

规范:项目、目录、文件、样式、事件、变量、方法、url参数、注释、git提交 命名规范及考证

一、规范命名的重要性 易懂、通用、规范、标准、专业性、是经验积累的体现 1.1、常见命名方法 序号命名方法解释1全小写2全大写3驼峰:小驼峰命名法4驼峰:大驼峰命名法5烤串命名法 / 脊柱命名法6下划线分隔法 二、项目名 采用小写字母和中划线&#…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

二:MySQL基础---查询专项练习

目录 表结构 1. 数据月表(zbr_data_monthly_data_YYYYMM) 2. 分类表(zbr_category) 3. 用户表(zbr_user) 4. 交易表(zbr_transaction) 查询知识点 1. 基本查询 2. 连接查询 …

C++线程异步

本文内容来自: 智谱清言 《深入应用C11 代码优化与工程级应用》 std::future std::future作为异步结果的传输通道,可以很方便地获取线程函数的返回值。 std::future_status Ready (std::future_status::ready): 当与 std::future 对象关联的异步操作…

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…

04字符串算法/代码随想录

四、字符串 反转字符串 力扣344 遇到数组双指针真是太好用了&#xff0c;左右指针不断逼近即可&#xff0c;代码也很简单 class Solution {public void reverseString(char[] s) {int fast s.length - 1;int slow 0;while (slow < fast) {char temp s[fast];s[fast] s[…

conda找不到对应版本的pytorch,就会自动下载cpu版本的

踩坑一&#xff1a; conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia (本人的服务器支持的 且python3.8.20) 先nvidia-smi查看自己cuda支持的最高版本&#xff0c;然后去pytorch官网寻找对应的torch、torchaudio、to…

信息学科平台设计与实现:Spring Boot技术详解

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 零、前言一、应用层协议原理1.1 网络应用的体系结构1.1.1 客户-服务器(C/S)体系结构1.1.2 对等体&#xff08;P2P&#xff09;体系结构1.1.3 C/S 和 P2P体系结构的混合体 1.2 进程通信1.2.1 问题1&#xff1a;对进程进行编址&#xff08;addressing&#xff09;&#…

Java面向对象 C语言字符串常量

1. &#xff08;1&#xff09;. package liujiawei;public class Phone {String brand;double price;public void call(){System.out.println("手机打电话");}public void play(){System.out.println("手机打游戏");} } public class phonetest {public…

【逆向基础】十八、PE文件格式(三)

一、简介 文本章主要讲结构体IMAGE_DATA_DIRECTORY数组。它制定了各种数据目录的地址与大&#xff1b;PE装载器可以通过这些信息准确加载PE文件所需的函数&#xff0c;资源等&#xff1b;此外&#xff0c;数据目录表也是设置钩子&#xff0c;注入等逆向的理论基础。所以学习这…

Session条件竞争--理论

条件竞争 多个线程同时访问一个共享变量或文件时&#xff0c;由于线程的执行顺序不符合预期而导致最后的执行结果不符合开发者的预期。 session session,被称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样&#xff0c;当用户在应用程序的Web页之间…

Centos8安装软件失败更换镜像源

问题 在Centos 8上安装git&#xff0c;报错如下&#xff1a; sudo dnf install git -y Repository extras is listed more than once in the configuration CentOS Linux 8 - AppStream 0.0 B/s …

如何让网页中的图片不可下载,让文字不可选中/复制

使用css中的伪属性来完成这个操作. 效果展示 文字不可复制: 图中这几个中文字符无法被选中,双击前面这几个字也只能选中后面的英文内容,无法选中也就无法复制. 既然常规方式无法选中,那打开浏览器开发者工具总能复制吧! 我经常这样干, 但是很遗憾,页面检查中根本就没那些内容…

Linux 之 信号概念、进程、进程间通信、线程、线程同步

学习任务&#xff1a; 1、 信号&#xff1a;信号的分类、进程对信号的处理、向进程发送信号、信号掩码 2、 进程&#xff1a;进程与程序的概念、进程的内存布局、进程的虚拟地址空间、fork创建子进程、wait监视子进程 3、 学习进程间通信&#xff08;管道和FIFO、信号、消息队列…