python opencv1

一、基本参数

        OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库。

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

        imprort cv2

1、显示窗口

       cv2.namedWindow(winname, flags=None) :winname 窗口的名称,必须唯一,最好使用英文;flags  窗口标志 默认值为 WINDOW_AUTOSIZE(窗口大小根据图像大小自动调整,不能手动调整 ),当 flags  = cv2.WINDOW_NORMAL 时,自行拉动窗口调整大小。

        读取图像:cv2.imread('图片路径')

        显示图像:cv2.imshow('窗口名称' ,图片)

        关闭窗口:cv2.destroyAllWindows()

        

import cv2
# 读取图像
image = cv2.imread('images/car.png')
# 创建一个名为 "Image Window" 的窗口,允许调整大小
cv2.namedWindow('window', cv2.WINDOW_NORMAL)

# 根据名称重新调整该窗口的大小
cv2.resizeWindow("window", 500, 300)
# 将图像显示到指定窗口
cv2.imshow('Window', image)
# 等待用户按键 0 无限等待
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()

2、创建空白图像

        图像被读取后的结果为三维数组,那么可以使用数组方法创建一个元素全部为零的三维数组。

height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)

3、保存图片

        cv2.imwrite(存入路径,图片名称) 方法(与python的文本写入类似)。

cv2.imwrite("save_images/car.png", img)

4、裁剪图片

        等同于数组的切片,图片名称[纵坐标1:纵坐标2,横坐标1:横坐标2],也就是得到这块区域内的所有内容。

        注意:坐标的原点在图像的左上角,也就是横坐标从左到右,纵坐标从上到下。

import cv2
ima = cv2.imread("../../images/car.png")
h, w, c = ima.shape
print(f"高度:{h},宽度:{w},通道:{c}")
# 定义坐标 ,左上角点为原点。x向右,y向下
x = 325  # x小于图片宽度
y = 164  # y小于图片高度
w = 165  # x+w 小于图片宽度
h = 60  # y+h 小于图片高度
# 使用数组的切片操作,[高度1:高度2, 宽度1:宽度2],结果为高度2-高度1,宽度2-宽度1矩形区域
cai_image = ima[y: y+h, x: x+w]
h, w, c = cai_image.shape
print(f"高度:{h},宽度:{w},通道:{c}")
cv2.imshow("image", cai_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、调整图片大小

        cv2.resize(src, dsize, dst):src 指定需要调整的图片;dsize(width, height)  新的大小

r_ima = cv2.resize(ima, (200, 100))

6、图像绘制

        cv2.circle() 、 cv2.rectangle()、 cv2.putText()、cv2.line()

6.1、圆形

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

img:指定图片名称

center:圆的圆心(二维数组)

radius:半径(-1 表示实心圆)

color:圆的颜色

thickness:线条厚度

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()

 6.2、矩形

        cv2.rectangle(img, leftTop, rightFoot, color, width)

img:指定图片名称

center:圆的圆心(二维数组)

leftTop:矩形左上角顶点

rightFoot:矩形右下角顶点

color:边框颜色

width:线条宽度

img = cv2.imread("../../images/car.png")
# 绘制矩形
leftTop = (325, 164)  # 左上角顶点
rightFoot = (325 + 165, 164 + 60)  # 右下角顶点
color = (0, 255, 0)  # 颜色为绿色
width = 2  # 线条厚度
cv2.rectangle(img, leftTop, rightFoot, color, width)
# 显示带有矩形的图像
cv2.imshow('Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.3、文本

        putText(img, text, position, font_type, font_size, font_color, line_type)

img:指定图片名称

text:文本内容

position:文本出现的左下角位置(二维数组)

font_type:字体类型

font_size:子大小

font_color:字体颜色

line_type:字体线条粗细

image = cv2.imread("images/car.png")
text = "hello world!"
position = (50, 200)
font_type = cv2.FONT_HERSHEY_SIMPLEX
font_size = 1
font_color = (0, 255, 0)
line_type = 2
cv2.putText(image, text, position, font_type, font_size, font_color, line_type)
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        当遇到text传入汉字时,opencv无法处理,需要使用 PIL包内的Image, ImageDraw, ImageFont 三个模块处理。

        处理流程:

1、进行格式转化,将opencv图像转成pil图像;

pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

 2、创建对象绘图;

draw = ImageDraw.Draw(pil_image)

3、加载汉字字体 

font_type = "../fonts/simhei.ttf" 

font = ImageFont.truetype(font_type, font_size)

 4、绘制文本 

draw.text(position, text, fill=font_color, font=font) 

5、将处理好的图像转化成opencv图像 

image1= cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

最终代码

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
image = cv2.imread("../../images/car.png")
text = "哈喽"
position = (50, 50)
font_type = cv2.FONT_HERSHEY_SIMPLEX
font_size = 20
font_color = (0, 255, 0)
font_line = 1


# 判断输入文本是否为汉字
def is_chinese(char):
    if '\u4e00' <= char <= '\u9fff':
        return True
    else:
        return False


def put_text(image, text, position, font_size, font_color):
    global font_type
    font_type = "../fonts/simhei.ttf"
    # 将 OpenCV 图像转换为 PIL 图像
    pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(pil_image)

    # 加载字体
    font = ImageFont.truetype(font_type, font_size)

    # 在图像上绘制文本
    draw.text(position, text, fill=font_color, font=font)

    # 将 PIL 图像转换回 OpenCV 图像
    image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

    return image_with_text


# 判断传入文本是否为汉字
if is_chinese(text):
    image = put_text(image, text, position, font_size, font_color)
    print("1")
else:
    image = cv2.putText(image, text, position, font_type, font_size, font_color, font_line)
    print("2")

# 显示图像
cv2.imshow('Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

7、鼠标

        cv2.setMouseCallback

7.1、鼠标点击

def mytest(event, x, y, flag, param):
    print(f"event{event}")
    print(f"坐标{(x,y)}")
    print(f"flag={flag}")
    print(f"param={param}")


img = cv2.imread("../../images/car.png")
# 定义窗口
cv2.namedWindow("name")
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback("name", mytest)
cv2.imshow("name", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.2、鼠标控制

def mytest(event, x, y, flag, param):
    global d
    # 鼠标左键按下的事件:
    if event == cv2.EVENT_LBUTTONDOWN:
        print("鼠标左键按下")
        d = True
    elif event == cv2.EVENT_LBUTTONUP:
        print("鼠标左键松开")
        d = False
    elif event == cv2.EVENT_MOUSEMOVE:
        print("鼠标移动了")
        if d == True:
            cv2.circle(img, center=(x, y), radius=30, color=(0, 255, 0), thickness=-1)


img = cv2.imread("../../images/car.png")
# 定义窗口
cv2.namedWindow("name")

d = False

# 设置执行鼠标操作的回调函数
cv2.setMouseCallback("name", mytest)
while True:
    cv2.imshow("name", img)
    if cv2.waitKey(100) == 27:
        break


cv2.destroyAllWindows()

8、视频处理

        cv2.VideoCapture(0),0变化更为路径可获取本地视频。

import cv2

# 0 : 开启摄像头,参数为视频路径
cap = cv2.VideoCapture(0)
while True:
    # 读取视频
    #   ret 是否读取到视频,
    #   frame 图片(帧)
    ret, frame = cap.read()
    if ret:
        cv2.imshow("name", frame)
    if cv2.waitKey(20) == 27:
        break
cv2.destroyAllWindows()

 

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

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

相关文章

unity学习-异步场景加载

我们的项目在加载场景的时候如果需要加载的场景过大的话就会卡很久&#xff0c; 我们可以摒弃掉一定要到最后才加载下一个场景的观念&#xff0c;可以将加载场景的任务设置在任何地方&#xff0c;放在携程函数下&#xff0c;加载场景的任务和游戏运行任务同时进行 这叫做异步…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进&#xff0c;包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等&#xff0c;以提高故障识别的准确性和效率 模型框架&#x…

【一起python】使用python实现学生管理系统

文章目录 &#x1f4dd;前言&#x1f320;主函数man&#x1f309;菜单menu&#x1f309;添加学生信息&#x1f309;展示目前学生信息&#x1f309;查找学生&#x1f309;删除同学信息&#x1f309;退出程序 &#x1f320;python完整代码&#x1f6a9;总结 &#x1f4dd;前言 &…

前缀和_560. 和为 K 的子数组

560. 和为 K 的子数组 #include <unordered_map> class Solution { public:int subarraySum(vector<int>& nums, int k) {int nnums.size();unordered_map<int,int> hs;int sum0,re0;hs[0]1;for(int i0;i<n;i){sumnums[i];if(hs.count(sum-k)) rehs[s…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

excel表格文字识别-ocr表格文字提取api接口集成-python

表格文字识别接口的集成示例通常包含几个关键步骤&#xff0c;从接入API接口到最终数据处理和展示。以下是翔云表格文字识别接口的一个基本集成流程示例&#xff1a; 1. 获取接口信息 在开始集成前&#xff0c;请确保已经获取了表格文字识别API的接口文档&#xff0c;并了解该接…

Python酷库之旅-第三方库Pandas(182)

目录 一、用法精讲 841、pandas.api.types.is_complex函数 841-1、语法 841-2、参数 841-3、功能 841-4、返回值 841-5、说明 841-6、用法 841-6-1、数据准备 841-6-2、代码示例 841-6-3、结果输出 842、pandas.api.types.is_float函数 842-1、语法 842-2、参数 …

CSS基础学习篇——选择器

学习文档连接&#xff1a;CSS层叠样式表 1.全局选择器&#xff1a;* * {margin: 0;padding: 0;font-size: 18px; }2.类&#xff08;clss&#xff09;选择器&#xff0c;以 . 开头 .container {display: flex;justify-content: space-around;align-items: center;width: 1200…

Marin说PCB之电源的Surface Current Density知多少?

小编我是一位资深的国漫迷&#xff0c;像什么仙逆&#xff0c;斗破&#xff0c;斗罗&#xff0c;完美世界&#xff0c;遮天&#xff0c;凡人修仙传&#xff0c;少年歌行等&#xff0c;为了可以看这些视频小编我不惜花费了攒了很多年的私房钱去开了这个三个平台的会员啊&#xf…

CSS中display和visibility的区别

在 CSS 中&#xff0c;display 和 visibility 是两个用于控制元素显示和布局的属性&#xff0c;但它们的作用和效果是不同的。以下是它们的主要区别&#xff1a; 1.display 定义&#xff1a;display 属性用于控制元素的显示类型和布局行为。 常见值&#xff1a; none&#…

计算机毕业设计——ssm-基于SSM框架的校园爱心公益平台的设计与实现-演示录像2021

作者&#xff1a;程序媛9688开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0…

Oracle视频基础1.3.3练习

1.3.3 检查数据库启动情况 ps -ef | grep oracle启动数据库 sqlplus /nolog conn / as sysdba修改 fast_start_mttr_target 参数为初始值-50&#xff0c;缺省 scope 和 sid&#xff0c;查看修改结果 show parameter fast; alter system set parameter 250; show parameter fa…

CSS flex布局- 最后一个元素占满剩余可用高度转载

效果图 技术要点 height父元素必须有一个设定的高度flex-grow: 1 flex 盒子模型内的该元素将会占据父容器中剩余的空间F12检查最后一行的元素&#xff0c;高度就已经改变了&#xff1b;

LlamaIndex框架学习-提示词的几种使用模式

定义自定义提示词 定义自定义提示词就像创建格式字符串一样简单。 from llama_index.core import PromptTemplatetemplate ("We have provided context information below. \n""---------------------\n""{context_str}""\n------------…

基于vue框架的的驾校预约管理系统设计d5tq3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,驾校教练,车辆信息,报名信息,学员信息,考试预约,教学课程,教练评价,考试成绩,练车预约,报修申请,维修信息,课程类型,车辆类型 开题报告内容 基于Vue框架的驾校预约管理系统设计开题报告 一、项目背景与意义 随着驾驶培训行业的快…

shell脚本编写注意细节 ==、=等的区别

文章目录 和的使用主要区别小结 Shell脚本要注意的细节1. 变量引用和空格处理2. [[ ... ]] vs [ ... ]3. 使用-n和-z来检测变量是否为空4. 整数运算和浮点运算5. 避免使用反引号执行命令6. for循环中的命令替换7. 使用trap来清理临时文件8. 避免使用硬编码路径9. 使用-eq、-lt、…

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境&#xff0c;那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署&#xff0c;可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发&#xff0c;可以考虑使…

【1】基础概念

文章目录 一、特点二、基础语法注意三、官方编程指南四、go 语言标准库 API 一、特点 golang 一个 go 文件都要归属到一个包&#xff0c;需要进行申明。天然的并发&#xff1a;golang 从语言层面支持大并发。每个 go 文件都必须要归属到一个包中。执行 go 文件&#xff1a;go …

接口测试及常用接口测试工具(postman/jmeter)详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#…

CVE-2024-51567 CyberPanel upgrademysqlstatus 远程命令执行

该漏洞源于upgrademysqlstatus接口未做身份验证和参数过滤&#xff0c;未授权的攻击者可以通过此接口执行任意命令获取服务器权限&#xff0c;从而造成数据泄露、服务器被接管等严重的后果。 影响版本 CyberPanel v2.3.5CyberPanel v2.3.6 目前官方已有可更新版本&#xff0…