python opencv基础使用总结

1.安装opencv库:pip install opencv-python 

2.基础使用范例

import cv2
#图片的基本操作#
'''
1.读取一张图片
参数 1:图片的文件名
    如果图片放在当前文件夹下,直接写文件名就行,如'lena.jpg'
    否则需要给出绝对路径,如'D:\OpenCVSamples\lena.jpg'
参数 2:读入方式,省略即采用默认值
    cv2.IMREAD_COLOR:彩色图,默认值(1)
    cv2.IMREAD_GRAYSCALE:灰度图(0)
    cv2.IMREAD_UNCHANGED:包含透明通道的彩色图(-1)
'''

img = cv2.imread("D:/a.png")

#颜色转换为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#先定义窗口
#cv2.namedWindow('face', cv2.WINDOW_NORMAL)
# 2.显示图片
cv2.imshow('img', img)
cv2.imshow('gray',img_gray)
cv2.waitKey(0)

#获取图片属性
print(img.size)
print(img.shape)



#获取脸部ROI
# face=img[89:92,180:157]
# cv2.imshow('gg',face)
# cv2.waitKey(0)

#通道分隔与合并
# b,g,r= cv2.split(img)
# img=cv2.merge(b,g,r)

#b = img[:,0]
#cv2.imshow('blue',b)
#cv2.waitKey(0)

# 3.保存图片
#cv2.imwrite("D:/face.png", b)
print('save img success!')







import cv2

#打开摄像头#

#1.打开摄像头,并灰度显示
capture=cv2.VideoCapture(0)
# 获取捕获的分辨率
width, height = capture.get(3), capture.get(3)  #capture.get():获取本地视频属性
print("width,height为:", width, height)

# 以原分辨率的一倍来捕获
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2) #capture.set():设置本地视频属性
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, width * 2)
while(True):

    #获取一帧
    ret,frame = capture.read()

    #将这帧转换为灰度图
    gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(30) == ord('q'):
        break


 # 3.保存图片
cv2.imwrite("D:/its.png", gray)
print('save img success!')




import cv2

#播放本地视频


#播放本地视频
capture = cv2.VideoCapture('D:/名校励志演讲21.2012 巴纳德学院 奥巴马 .mp4')

while(capture.isOpened()):
    ret,frame = capture.read()
    gray= cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)

    if(cv2.waitKey(30) == ord('q')):
        break
 # 3.保存图片
cv2.imwrite("D:/obama.png", gray)
print('save img success!')






import cv2

#录制视频#


capture = cv2.VideoCapture(0)

#定义编码方式并创建VideoWriter对象
fourcc=cv2.VideoWriter_fourcc(*'MJPG') #定义编码方式Fourcc
outfile=cv2.VideoWriter('D:/obama.avi',fourcc,25.,(640,480)) #25:帧率 (640,480):分辨率

while(capture.isOpened()):
    ret,frame = capture.read()

    if ret:
        outfile.write(frame) #写入文件
        cv2.imshow('frame',frame)
        if(cv2.waitKey(1) == ord('q')):
         break
    else:
        break


print('save success!')






import cv2

#图像几何变换:旋转、平移、缩放和翻转图片#

img= cv2.imread('D:/a.png')

#按照指定的宽度,高度缩放图片
#res=cv2.resize(img,190,189)
#按照比例缩放,如:x,y轴均放大一倍
res2= cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)

#翻转图片:第二个参数(等于0,垂直翻转;大于0,水平翻转;小于0,水平垂直翻转)
dst=cv2.flip(res2,-1)

#获取行列
rows, cols = img.shape[:2]
#旋转图片,缩小一半
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
wp=cv2.warpAffine(dst,M,(cols,rows))  #平移/旋转,靠仿射变换cv2.warpAffine()实现的

#cv2.imshow('shrink',res)
# cv2.imshow('zoom',dst)

cv2.imshow('rotation',wp)
cv2.waitKey(0)



# 3.保存图片
cv2.imwrite("D:/face.png",dst)
print('save img success!')




import cv2
import numpy as np

#绘图 cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()#

#画线#
#创建黑色图片
img =np.zeros((512,512,3),np.uint8)
#画一条线
cv2.line(img,(0, 0), (512, 512), (255, 0, 0), 5)


#画矩形
cv2.rectangle(img,(384, 0), (510, 128), (0, 255, 0), 3)

#画圆
cv2.circle(img,(447, 63), 63, (0, 0, 255), -1)

#画椭圆
cv2.ellipse(img,(256, 256), (100, 50), 0, 0, 180, (255, 0, 0), -1)



#多边形
# 定义四个顶点坐标
pts = np.array([[10, 5],  [50, 10], [70, 20], [20, 30]], np.int32)
# 顶点个数:4,矩阵变成 4*1*2 维
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))


# 使用 cv2.polylines() 画多条直线
line1 = np.array([[100, 20],  [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60],  [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100],  [300, 100]], np.int32).reshape((-1, 1, 2))
cv2.polylines(img,[line1, line2, line3], True, (0, 255, 255))

#添加文字
font =cv2.FONT_HERSHEY_COMPLEX
cv2.putText(img,'China!!',(10,500),font,4, (255, 255, 255), 2, lineType=cv2.LINE_AA)

cv2.imshow('paint',img)
cv2.waitKey(0)







3.人脸检测实现
    首先在opencv官网下载opencv pc版的安装包
Releases - OpenCV
   

  其次,安装下载包,找到人脸检测的xml文件,如下:

注意:这些xml文件,可用于检测静止图像、视频和摄像所得到图像中的人脸
 

人脸检测特征数据文件

代码实现
 



import cv2

def fac_detect_demo(img):
   #将图片转换为灰度图片
   gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
   #加载特征数据
   face_detector=cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
   faces=face_detector.detectMultiScale(gray)

   # x,y为起始坐标,w,h为宽高
   for x,y,w,h in faces:
      # (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,255,0)即绿色;thickness=2为矩形的边框
       cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)  
   cv2.imshow('reuslt:',img)



#人脸检测-图片单张人脸

#1.加载图片
img = cv2.imread("D:/aa.png")

#2.人脸检测
fac_detect_demo(img)

cv2.waitKey(0)
cv2.destroyAllWindows() #释放内存空间

效果如下:

import cv2

def fac_detect_demo(img):
   #将图片转换为灰度图片
   gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
   #加载特征数据
   face_detector=cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
   faces=face_detector.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3,maxSize=(50,50))  #进行人脸检测

   # x,y为起始坐标,w,h为宽高
   for x,y,w,h in faces:
       print(x,y,w,h)
      # (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,0,255)即红色;thickness=2为矩形的边框
       cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
       cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)
   cv2.imshow('reuslt:',img)


#人脸检测-图片多张脸

#1.加载图片
img = cv2.imread("D:/aaa.png")

#2.调用人脸检测方法
fac_detect_demo(img)
cv2.waitKey(0)
cv2.destroyAllWindows() #释放内存空间

效果如下:

人脸检测-视频中人脸识别

import cv2

def face_detect_demo(img):
    # 将图片转换为灰度图片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 加载特征数据
    face_detector = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    faces = face_detector.detectMultiScale(gray,maxSize=(210,210),minSize=(120,120))  # 进行人脸检测

    # x,y为起始坐标,w,h为宽高
    for x, y, w, h in faces:
        print(x, y, w, h)
        # (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,0,255)即红色;thickness=2为矩形的边框
        cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
        cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=2)
    cv2.imshow('reuslt:', img)


#人脸检测-视频中人脸识别
#读取视频
cap= cv2.VideoCapture('D:/名校励志演讲21.2012 巴纳德学院 奥巴马 .mp4')
while True:
    flag,frame= cap.read()
    if not flag: #读到视频结尾,break
        break
    face_detect_demo(frame)
    if ord('q')==cv2.waitKey(10):
        break
cv2.destroyAllWindows()
cap.release()

效果如下:

训练人脸数据

import os

import cv2
import numpy as np
from PIL import Image


#训练数据

def getImageAndLabels(path):
    facesSamples=[]
    ids=[]
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]

    #检测人脸
    face_detector = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')


    #遍历列表中的图片
    for imagePath in imagePaths:
        #打开图片
        PIL_img=Image.open(imagePath).convert('L')
        #将图像转换为数组
        img_numpy=np.array(PIL_img,'uint8')
        faces = face_detector.detectMultiScale(img_numpy)  #获取人脸
        #获取每张图片的id
       # print(os.path.split(imagePath))
        id=int(os.path.split(imagePath)[1].split('.')[0])
        for x, y, w, h in faces:
           facesSamples.append(img_numpy[y:y+h,x:x+w])
           ids.append(id)
    return facesSamples,ids


if __name__=='__main__':
    #1.图片路径
    path='./data/img/'
    #2.获取图像数组和id标签数组
    faces,ids=getImageAndLabels(path)
    #3.获取训练对象
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train(faces,np.array(ids))
    #4.保存训练数据到文件
    recognizer.write('trainer/trainer.yml')

人脸识别


import cv2.face
#人脸识别#

#加载训练的数据文件
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
#准备识别的图片
img=cv2.imread('D:/obama.png')
#对图片进行灰度
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray)  # 进行人脸检测
# x,y为起始坐标,w,h为宽高
for x, y, w, h in faces:
    # print(x, y, w, h)
    # (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,255,0)即绿色;thickness=2为矩形的边框
    cv2.rectangle(img, (x, y), (x + w, y + h), color=(0,255,0), thickness=2)
    #人脸识别
    id,confidence=recognizer.predict(gray[y:y+h,x:x+w])
    print("标签id:",id,"置信评分:",confidence)
cv2.imshow('reuslt:', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…

OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境

在 OpenEuler 上搭建 OpenGauss 数据库环境需要按照以下步骤进行。OpenGauss 是华为开源的一款高性能关系型数据库,支持高并发、高可用性和分布式部署。 1. 环境准备 确保你的 OpenEuler 系统满足以下要求: 操作系统:OpenEuler 20.03 LTS 或…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…

【数据结构】(9) 优先级队列(堆)

一、优先级队列 优先级队列不同于队列,队列是先进先出,优先级队列是优先级最高的先出。一般有两种操作:返回最高优先级对象,添加一个新对象。 二、堆 2.1、什么是堆 堆也是一种数据结构,是一棵完全二叉树&#xff0c…

AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知

写在前面 没接触过 SSE(Server-Sent Events),AI大模型出来之后,一直以为文本流是用 WebSocket 做的偶然看到返回到报文格式是 text/event-stream,所以简单认知,整理笔记博文内容涉及 SSE 认知,以及对应的 D…

计时器任务实现(保存视频和图像)

下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…

力扣19题——删除链表的倒数第 N 个结点

#题目 #代码 //定义虚拟头结点ListNode curnew ListNode(0,head); //定义两个指针指向虚拟头结点ListNode lcur;ListNode rcur;for(int i0;i<n;i){rr.next;}while(r!null){rr.next;ll.next;} //l.next就是我们要删除的那个元素if(l.next!null){l.nextl.next.next;}return c…

网络工程师 (42)IP地址

一、定义与功能 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。这种地址分配方式确保了用户在连网的计算机上操作时&#xff0c;能够高效且方便地从众多计算机中选出自己所需…

记忆力训练day19

万能字母组合编码法 所有的文字和字母的背后都有画面 练的不是记单词&#xff0c;练的是注意力给到单词&#xff0c;出什么画面&#xff0c;然后画面与画面之间进行连接 拆的过程就是找熟词的过程 要关注自己的回忆路径是什么&#xff1f;也就是你是怎么回忆起来的&#xff0c…

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…

八、SPI读写XT25数据

8.1 SPI 简介 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是一种同步串行通信协议&#xff0c;广泛用于嵌入式系统中连接微控制器与外围设备&#xff0c;如传感器、存储器、显示屏等。 主要特点 1. 全双工通信&#xff1a;支持同时发送…

kibana es 语法记录 elaticsearch

目录 一、认识elaticsearch 1、什么是正向索引 2、什么是倒排索引 二、概念 1、说明 2、mysql和es的对比 三、mapping属性 1、定义 四、CRUD 1、查看es中有哪些索引库 2、创建索引库 3、修改索引库 4、删除索引库 5、新增文档 6、删除文档 5、条件查询 一、认识…

三、Unity基础(主要框架)

一、Unity场景概念 如果把游戏运行过程理解成表演&#xff0c;那么场景就是舞台&#xff1b; 场景本质上是一个配置文件&#xff0c;这个配置文件决定了场景中有哪些东西&#xff1b; 二、Scene和Game窗口 1、Scene 滚轮缩放、拖动 单独选中也可以 最下面这个是全能工具…

pdf文档提取信息

目录 一、前言二、核心代码说明1、PyPDF2提取文本2、pdfplumber提取文本和表格3、fitz提取文本和图片4、fitz按页提取图片一、前言 本博客文章介绍pdf的文本、图片、表格等信息提取的技术方案对比。目前比较熟知的是pdfplumber 、PyPDF2 、fitz(PyMuPDF)。 它们之间对比如下 …

Git指南-从入门到精通

代码提交和同步命令 流程图如下&#xff1a; 第零步: 工作区与仓库保持一致第一步: 文件增删改&#xff0c;变为已修改状态第二步: git add &#xff0c;变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…

我们来学HTTP/TCP -- 三次握手?

三次握手 题记三次呼叫结语 题记 来&#xff0c;我们来演示下川普王和普京帝会面了 哎呦&#xff01;你好你好&#xff0c;握手…哎嗨&#xff01;侬好侬好&#xff0c;握手…欧嘿呦玛斯&#xff0c;握手… 抓狂啊&#xff01;作孽啊!!! 不说人话啊! 关键的是&#xff0c;“三…

kubectl top输出与Linux free命令不一致原因?

当你在 Kubernetes 集群中使用 kubectl top 命令查看资源使用情况时&#xff0c;可能会发现与在节点上直接运行 Linux free 命令得到的结果不一致。这种不一致可能源于多个原因&#xff0c;以下是一些关键因素&#xff1a; MobaXterm中文版下载&#xff1a; https://pan.quark…

【设计模式】【行为型模式】迭代器模式(Iterator)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

论文解读之DeepSeek R1

今天带来DeepSeek R1的解读 一、介绍 deepseek主打复杂推理任务&#xff0c;如数学、代码任务。 R1以预训练过的V1-base初始化&#xff0c;主要发挥了RL在长思维链上的优势&#xff0c;R1-Zero直接RL而在前置步骤中不进行SFT&#xff0c;即缺少了有监督的指令微调阶段&#…

Linux:用 clang 编译带 sched_ext 功能内核

文章目录 1. 前言2. 编译过程2.1 准备内核源代码2.2 安装编译工具2.3 配置、编译、运行2.3.1 配置2.3.2 编译2.3.3 运行 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 编译过程 …