学习opencv(一)

OpenCV简介

OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定。 OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等。

在这里插入图片描述

环境搭建(OpenCV + python +pycharm)

在这里插入图片描述

第一个程序来检测环境是否正常

import cv2 as cv

src = cv.imread("E:/001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
cv.waitKey(0)
cv.destroyAllWindows()


print("hi,python")

正式学习opencv

什么是图像

图像就是信息,信息就是数据。结构化存储的数据信息。

显示图像

mport cv2 as cv
import numpy as np

# 这个函数的作用是显示图像的通道数目、长宽大小、像素数据
def get_image_info(image):
    print(type(image))
    print(image.shape)
    print(image.size)
    print(image.dtype)
    pixel_data = np.array(image)
    print(pixel_data)


print("-----------hello-----------")
# 下面三行代码的作用就是输出图像
src = cv.imread("E:/001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

get_image_info(src)
cv.waitKey(0)

cv.destroyAllWindows()

调用摄像头

mport cv2 as cv
import numpy as np


def video_demo():
    capture = cv.VideoCapture(0)
    while True:
        ret, frame = capture.read()
        frame = cv.flip(frame, 1) # 反向
        cv.imshow("video", frame)
        c = cv.waitKey(50)
        if c == 27:
            break
            

# 下面一行代码就是调用这个函数,调出摄像头
print("-----------hello-----------")
video_demo()
cv.waitKey(0)

cv.destroyAllWindows()

注意:OpenCV读出来的视频是没有声音的,并不是一个视频解码的工具。

输出一个图片的长、宽、通道数

import cv2 as cv
import numpy as np


def access_pixels(image):
    print(image.shape)  # shape有三个值
    height = image.shape[0]
    width = image.shape[1]
    channels = image.shape[2]
    print("width : %s, height :%s channels : %s"%(width, height, channels))


print("----------hello----------")
src = cv.imread("E:/001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
access_pixels(src)
cv.waitKey(0)

cv.destroyAllWindows()

显示结果如下:
在这里插入图片描述

np.ones()函数学习

  • np.ones(shap, dtype=None, order=‘C’)
    返回给定形状和类型的新数组,填充1.
1、shape代表数据形状,是个元组。如果shape=5代表创建一个五个元素的一维数组。shape= (3,4)代表创建一个3*4的二维数组;
2、dtype代表数据类型,dtype=“int”
3、order代表 'C'or'F',可选是否以内存中的C或Fortran连续(按行或按列)顺序存储。

例1

下面的代码输出一个三行两列的数组,每一个元素都是1.(默认是float类型)

import numpy as np

ones = np.ones((3, 2))
print(ones)

在这里插入图片描述

例2

可以定义一下数据类型是int。

import numpy as np

ones = np.ones((3, 2), dtype=int)
print(ones)

在这里插入图片描述

img = np.zeros([400, 400, 3], np.uint8)
# 创建一个零矩阵
# 创建400*400, 3个通道的矩阵图像,classname是uint8

img[:, :, 0] = np.ones([400, 400]) * 255
# 创建400*400的全1矩阵,*255就生成了全255矩阵,并将这个矩阵的值赋给img的第一通道 【结果是蓝色】
img[:, :, 1] = np.ones([400, 400]) * 255
# 同理,这个输出的是绿色
img[:, :, 2] = np.ones([400, 400]) * 255
# 同理,这个输出的是红色
# 一二三通道的顺序是: B G R 

# 将三个通道同时赋值,得到白色
def create_image():
    img = np.zeros([400, 400, 3], np.uint8)
    img[:, :, 0] = np.ones([400, 400]) * 255
    img[:, :, 1] = np.ones([400, 400]) * 255
    img[:, :, 2] = np.ones([400, 400]) * 255
    cv.imshow("new image", img)

色彩空间的转换

  • hsv和RGB的转换
  • yuv和RGB的转换
    在这里插入图片描述
def color_space_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    cv.imshow("gray", gray)
    hsv = cv.cvtColor(image, cv.COLOR_RGB2HSV)
    cv.imshow("hsv", hsv)
    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
    cv.imshow("yuv", yuv)

学习inRange

H:0——180
S:0——255
V:0——255

在这里插入图片描述

  • 提取绿色的图案
def extrace_object_demo():
    capture = cv.VideoCapture("E:/video/video.mp4")
    while True:
        ret, frame = capture.read()
        if not ret: # if ret == False
            break

        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        lower_hsv = np.array([37, 43, 46])
        upper_hsv = np.array([77, 255, 255])
        mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
        cv.imshow("video", frame)
        cv.imshow("mask", mask)
        c = cv.waitKey(40)
        if c == 27:
            break

两个相同大小的图片相加

def add_demo(m1, m2):
    dst = cv.add(m1, m2)
    cv.imshow("add demo", dst)

img1 和img2如下图所示:
在这里插入图片描述
相加后输出结果:
在这里插入图片描述
相减后输出的结果:
在这里插入图片描述

关于shape

img.shape[:2]取彩色图片的长、宽
img.shape[:3]取彩色图片的长、宽、通道
img.shape[0]图像的垂直尺寸(高度)
img.shape[1]图像的水平尺寸(宽度)
img.shape[2]图像的通道数
注:矩阵中,[0]表示行数,[1]表示列数

图像的均值和方差

# im表示图片 
(mean , stddv) = cv2.meanStdDev(im)
print(mean, stddv)
# 表示均值和方差

提升亮度和对比度

ROI和泛宏填充

ROI操作:局部变为灰色

import cv2 as cv
import numpy as np

print("-------Hello Python-------")
src = cv.imread("E:/001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)


test = src[50:200, 100:300]
gray = cv.cvtColor(test, cv.COLOR_BGR2GRAY)  # 转为灰度图片
blackface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
src[50:200, 100:300] = blackface
cv.imshow("upgrade", src)


cv.waitKey(0)
cv.destroyAllWindows()

计算python代码的时间消耗

t1 = cv.getTickCount()
create_image() # 替换成想要计算时间消耗的函数
t2 = cv.getTickCount()
time = ((t2 - t1) / cv.getTickFrequency())
print("time : %s" % (time * 1000))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值