opencv
简介:
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和[Mac OS](https://baike.baidu.com/item/Mac OS/2840867)操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
应用于:1、人机互动2、物体识别3、图像分割4、人脸识别5、动作识别6、运动跟踪7、机器人8、运动分析9、机器视觉10、结构分析11、汽车安全驾驶
opencv读取的图片数据格式为numpy的nparray格式。
一张二维图片是由像素点构成,如下图所示:
其中行与列确定了像素点的位置,值确定了颜色,通常为三通道RGB值
对应维度信息表示:
[图片高度,图片宽度,像素BGR值]
[数组行数,数组列数,像素BGR值]
[Height,Width,Channels]
Ps:opencv读取的图片数值为BGR格式,与PIL库读取图片得到的RGB格式不同,因此如果用其他库的imshow函数来显示图片,图片的颜色会发生变化
BGR含义
B:Blue
G:Green
R:Red
分别代表三原色,不同的颜色由不同的三原色配比得到。因此,在一张二维图片的像素点数组中,确定行与列后,还会获取该位置三原色的数值,用以表示颜色。
Ps:像素值大小[0,255]
下载
pip install opencv-python==3.4.8.29
使用
res = cv2.imread(file_road)
res.shape
python CV2中shape和resize返回值和参数的区别
1、在一副图像中使用shape得到一个3个类别的列表
shape[0] =图像的高
shape[1] =图像的宽
shape[2] = 图像的图像通道数量
2、在对一幅图像进行缩放时
resize(img, (w, h))中w表示宽度,h表示高度,正好与shape[0]和shape[1]相反
小项目
import cv2
import numpy as np
import os
import matplotlib.pyplot as plt
class Cv2Use:
def __init__(self):
pass
def get_img(self, path):
img = cv2.imread(path)
print(f"raw img shape: {img.shape[:2]}")
return img
def img_slice(self, img):
# 切割高度(roi)
img = img[6000:8000]
print(f"slice img shape: {img.shape[:2]}")
return img
def get_roi(self, img):
roi = img[6520:7400, 769:1029]
print(f"roi img shape : {roi}")
return roi
def np_rot90(self, img):
img = np.rot90(img, -1)
return img
def rote_round(self, img, angle):
if angle == 0:
return img
(h, w) = img.shape[:2]
# 选择旋转中心点,整除2
(cX, cY) = (w // 2, h // 2)
# 选装
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
print(f"2D 旋转后 M :{M}")
# 图片自适应
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
print(f"cos {cos}, sin {sin}")
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
# 得到矩阵后得用到图像的仿射变换函数才可以进行最终图像的变化
return cv2.warpAffine(img, M, (nW, nH), borderValue=(255, 255, 255))
def show_img(self, img):
# plt.subplot(121)
# plt.imshow(img)
# plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.rcParams['axes.unicode_minus'] = False
# plt.title('原图')
# plt.axis(False)
# plt.show()
# plt.subplot(122)
# plt.imshow(img)
# plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.rcParams['axes.unicode_minus'] = False
# plt.title('绕中心点旋转的图像')
# plt.axis(False)
cv2.imshow('solar_panel', img)
cv2.waitKey(0)
def save_ch_angle(self, path):
if not os.path.exists(path):
print("路径不存在")
return
file_names = os.listdir(path)
print(file_names)
for filename in file_names:
img_dir = os.path.join(path, filename)
img = cv2.imread(img_dir)
print(f"img shape : {img.shape[:2]}")
img = np.rot90(img, 1)
print(f"img shape : {img.shape[:2]}")
cv2.imwrite(img_dir, img)
def detect_barcode(self, img_new, img):
# 高斯模糊,将图片平滑化,去掉干扰的噪声
image = cv2.GaussianBlur(img_new, (5, 5), 3)
# 图片灰度化
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Sobel算子(X方向)
Sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0)
absX = cv2.convertScaleAbs(Sobel_x) # 转回uint8
# cv2.imshow("img",absX)
# cv2.waitKey(0)
ret, image = cv2.threshold(absX, 127, 255, cv2.THRESH_OTSU)
# cv2.imshow("img", image)
# cv2.waitKey(0)
# 开闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 5))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX)
# cv2.imshow("img", image)
# cv2.waitKey(0)
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 5))
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernelX)
# 膨胀
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
image = cv2.dilate(image, kernelX)
# 中值滤波
# image = cv2.medianBlur(image, 17)
# cv2.imshow("img", image)
# cv2.waitKey(0)
# 轮廓提取
_, contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 提取边界矩形,从中判断合适的建议框
sum = []
# print(len(contours))
if contours is not None:
for item in contours:
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
width = rect[2]
height = rect[3]
# 筛选边界矩形
if (height * 4) < width and height > 20:
# 裁剪区域图片
a = img[y * 2:(y + height) * 2, x * 2:(x + width) * 2]
cv2.imshow("a", img)
cv2.waitKey(0)
# a = cv2.flip(a, -1)
# a = rotate_round(a, 90)
sum.append(a)
return sum
if __name__ == '__main__':
cv2_obj = Cv2Use()
# cv2_obj.save_ch_angle(r"D:\projects\owner\rote_test")
img = cv2_obj.get_img(r"D:\projects\owner\test\2022_8_25_10_20_11_1661394011.0491812.jpg")
img = cv2_obj.img_slice(img)
# 图片旋转
img = cv2_obj.rote_round(img, 55)
img_new = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))
barcode = cv2_obj.detect_barcode(img_new, img)
print(barcode)
# img = cv2_obj.get_roi(img)
# img = cv2_obj.np_rot90(img)
cv2_obj.show_img(img_new)
标签:plt,img,python,image,cv2,opencv,shape,print
From: https://www.cnblogs.com/elijah-li/p/16640058.html