首页 > 编程语言 >cv2简单使用(opencv-python)

cv2简单使用(opencv-python)

时间:2022-08-30 17:14:16浏览次数:85  
标签:plt img python image cv2 opencv shape print

opencv

简介:

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉机器学习软件库,可以运行在LinuxWindowsAndroid和[Mac OS](https://baike.baidu.com/item/Mac OS/2840867)操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它具有C ++,PythonJavaMATLAB接口,并支持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

相关文章