Python-Opencv(一):OpenCv的简单探索

参考:https://www.cnblogs.com/zlel/p/9267629.html

一、python-OpenCV的简介与安装

opencv 是用于快速处理图像、计算机视觉问题的工具,支持多种语言进行开发,如c++、python、java等。

安装opencv-python: pip install opencv-python

安装完opencv-python后命令行打开python交互式环境:import cv2 成功,便说明成功安装了opencv-python

二、opencv-python读取、展示和存储图像

1、图片的加载、显示和保存

说明:

  1. cv2.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都将被忽略。它是默认标志
  2. cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
  3. cv2.IMREAD_UNCHANGED:保留读取图片原有的颜色通道

1 :等同于cv2.IMREAD_COLOR
0 :等同于cv2.IMREAD_GRAYSCALE
-1 :等同于cv2.IMREAD_UNCHANGED

import cv2
# 读取图片
img = cv2.imread(r'fengjing1.jpg')
print(img)

# 生成灰色图片
img_grey = cv2.imread(r'shanghai1.jpg',0)
print(img_grey)
'''
1、建议像素不要太低,至少以前以上吧,否则质量太差会显示不出来图片
2、生成的图片为numpy数组的形式
'''

# 展示原图
cv2.imshow('scene',img)

# 展示灰度图片
cv2.imshow('img1',img_grey)

cv2.waitKey()   # 等待

# 保存灰度图片
cv2.imwrite('img_grey1.jpg',img_grey)
cv2.imwrite('img_grey2.jpg',img)

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

2、图像显示窗口创建与销毁

当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个:

(1)cv2.destroyWindow(windows_name) #销毁单个特定窗口
参数: 将要销毁的窗口的名字
(2)cv2.destroyAllWindows() #销毁全部窗口,无参数

  1. cv2.namedWindow(窗口名,属性) 创建一个窗口属性—指定窗口大小模式:
  2. cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
  3. cv2.WINDOW_NORMAL:窗口大小可调整
  4. cv2.destoryAllWindows(窗口名) 删除任何建立的窗口

那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:

(1) 让窗口停留一段时间然后自动销毁;
(2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口
以上两种情况都将使用cv2.waitKey函数, 首先产看函数定义:

cv2.waitKey(time_of_milliseconds)

唯一参数 time_of_milliseconds是整数,可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况

(1) time_of_milliseconds > 0 :此时time_of_milliseconds表示时间,单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁

#表示等待1秒后,将销毁所有图像
if cv2.waitKey(1000):
cv2.destroyAllWindows()

#表示等待1秒,将销毁窗口名称为’fengjing1’的图像窗口
if cv2.waitKey(1000):
cv2.destroyWindow(‘fengjing1’)

(2) time_of_milliseconds <= 0 : 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁。我们可以自定义等待敲击的键盘,通过下面的例子进行更好的解释

#当接收到键盘敲击A时,便销毁名称为’origin image’的图像窗口
if cv2.waitKey(-1) == ord(‘A’):
cv2.destroyWindow(‘origin image’)

img = cv2.imread('fengjing1.jpg')

cv2.namedWindow('tu_1',cv2.WINDOW_NORMAL)
cv2.imshow('fnegjing_1',img)
# if cv2.waitKey(5000):
#     cv2.destroyAllWindows()

if cv2.waitKey(-1) == ord('A'):
    cv2.destroyAllWindows()

3、图片宽、高、通道数获取

'''
img.shape 返回图像高(图像矩阵的行数)、宽(图像矩阵的列数)和通道数3个属性组成的元组,若图像是非彩色图,则只返回高和宽组成的元组。
'''
img = cv2.imread('fengjing1.jpg')
imgGrey = cv2.imread('fengjing1.jpg',0)

sp1 = img.shape
sp2 = imgGrey.shape   # 注意不用加括号了

# 返回高和宽以及通道数
print(sp1,sp2) # (1200, 1920, 3) (1200, 1920)

4、图像像素数目和图像数据类型的获取

# 图像矩阵img的size属性和dtype分别对应图像的像素总数目和图像数据类型。一般情况下,图像的数据类型是uint8。
imgSize = img.size
print(imgSize)   # 6912000
ty = img.dtype
print(ty)        # uint8

5、生成指定大小的空图像

import cv2
import numpy as np

img = cv2.imread('fengjing1.jpg')
imgZero = np.zeros(img.shape,np.uint8)
# print(imgZero)  # 三重0的列表

imgFix = np.zeros((300,500,3),np.uint8)

cv2.imshow('img',img)
cv2.imshow('imgZero',imgZero)
cv2.imshow('imgFix',imgFix)
cv2.waitKey()

生成的三个图像窗口中,只有img是有图像的,其余两个都是只要空图像

6、访问和操作图像像素

'''
OpenCV中图像矩阵的顺序是B、G、R。可以直接通过坐标位置访问和操作图像像素。
'''
import cv2

img = cv2.imread('fengjing1.jpg')
numb = img[50,100]  # 访问像素
# print(numb)  # [208 197 200]

img[50,100] = (0,0,255)  # 操作图像像素
cv2.imshow('img',img)
cv2.waitKey()
# 分开访问图像某一通道像素值也很方便
img = cv2.imread('fengjing1.jpg')
# # 选定某一范围改变像素值
# img[0:100,100:200,0] = 255
# img[100:200,200:300,1] = 255
# img[200:300,300:400,2] = 255

# 更改某一矩形的像素值
img[0:50,1:100] = (43,244,255)
cv2.imshow('img',img)
cv2.waitKey()

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

7、图像三通道分离和合并

'''
分离图像通道可以使用cv2中的split函数,合并使用merge函数。
'''
import cv2
img = cv2.imread('fengjing1.jpg')

b,g,r = cv2.split(img)
# print(b,g,r)

cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)

merged = cv2.merge([b,g,r])
# print(merged)
cv2.imshow('Merged',merged)
cv2.waitKey()

8、在图像上输出文字

    img: 图像
    text:要输出的文本
    org: 文字的起点坐标
    fontFace: 字体
    fontScale: 字体大小
    color: 字体颜色
    thickness: 字图加粗
'''
使用putText函数在图片上输出文字,函数原型:
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
'''
img = cv2.imread('fengjing1.jpg')
cv2.putText(img,'very beautiful this scene',(100,100),cv2.FONT_HERSHEY_COMPLEX,3,(0,0,255))

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

在这里插入图片描述

9、图像缩放

'''
缩放使用cv2.resize()函数,resize函数里的size第一个是宽(列),第二个是高(行)。
'''
img = cv2.imread('fengjing1.jpg')
cv2.imshow('img',img)

imgg = cv2.resize(img,(200,100))
cv2.imshow('imgg',imgg)

cv2.waitKey()

在这里插入图片描述

10、图片灰化处理

from matplotlib import pyplot as plt
import cv2
from pylab import *

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\COOPBL.TTF",size = 14)

# 载入图像
im = cv2.imread('fengjing1.jpg')
# 显示原始图像
fig = plt.figure()
# print(fig)  # Figure(640x480)

subplot(121)
plt.gray()
im2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #OpenCV采用BGR排列顺序,需要转换一下.
# print(imshow(img2))  # AxesImage(80,52.8;225.455x369.6)

imshow(im2)
title(u'caise_figure', fontproperties= font)
axis('off')
# 显示灰度化图像
# 颜色空间转换
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
plt.subplot(122)
plt.gray()
imshow(gray)
title(u'huidu_figure', fontproperties= font)
axis('off')
show()

在这里插入图片描述

11、在python3 下使用OpenCV抓取摄像头图像提取蓝色

import cv2
import numpy as np

cap  = cv2.VideoCapture(0)
for i in range(0, 19):
     print(cap.get(i))
while 1:
     ret, frame = cap.read()
     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

     lower_blue = np.array([100, 47, 47])
     upper_blue = np.array([124, 255,255])

     mask = cv2.inRange(hsv, lower_blue, upper_blue) #蓝色掩模

     res = cv2.bitwise_and(frame, frame, mask = mask)

     cv2.imshow(u"Capture", frame)
     cv2.imshow(u"mask", mask)
     cv2.imshow(u"res", res)

     key = cv2.waitKey(1)
     if key & 0xff == ord('q') or key == 27:
         print(frame.shape,ret)
         break
cap.release()
cv2.destroyAllWindows()
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值