img_process

img_process.py 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import cv2
import numpy as np


# 全局阈值
# notice the size of img
def threshold_demo(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)
    print("threshold value %s" % ret)
    cv2.namedWindow("binary", cv2.WINDOW_NORMAL)
    cv2.imshow("binary", binary)


# 局部阈值
# notice the size of img
def local_threshold(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 自适应阈值化能够根据图像不同区域亮度分布,改变阈值
    binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10)
    cv2.imshow("local_threshold", binary)


# 用户自己计算阈值

def custom_threshold(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    h, w = gray.shape[:2]
    m = np.reshape(gray, [1, w * h])
    mean = m.sum() / (w * h)
    print("mean:", mean)
    ret, binary = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
    cv2.namedWindow("custom_threshold", cv2.WINDOW_NORMAL)
    cv2.imshow("custom_threshold", binary)



def big_img_binary(img):
    # 定义分割块的大小
    cw = 256
    ch = 256
    h, w = img.shape[:2]
    # 将图片转化为灰度图片
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            roi = gray[row:row + ch, col:col + cw]
            dst = cv2.adaptiveThreshold(roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 127, 20)
            gray[row:row + ch, col:col + cw] = dst
    cv2.imwrite('Binaryzation.png', gray)



#轮廓面积计算函数(所有)
def areaCal(contour):
    area = 0
    for i in range(len(contour)):
        area += cv2.contourArea(contour[i])
    return area


def test():
    src = cv2.imread('/home/pi/project-car/foo.jpg')
    h, w, depth = src.shape
    # notice the resolution, if the pic is so large, the system will reboot
    img = cv2.resize(src, (int(w / 10), int(h / 10)), interpolation=cv.INTER_AREA)
    cv2.namedWindow('input_image', cv2.WINDOW_NORMAL)  # 设置为WINDOW_NORMAL可以任意缩放
    cv2.imshow('input_image', img)
    threshold_demo(img)
    local_threshold(img)
    custom_threshold(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


src = cv2.imread('DEMO.jpg')
# threshold(src)
# local_threshold(src)
# custom_threshold(src)
# big_img_binary(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

split_flow.py

import numpy as np
import os

root_path = "/youedata/linzhikun/code/data/Kinetics/val"


def splitflow(root_dirs):
    video_dirs = os.listdir(root_dirs)
    for video_dir in video_dirs:
        tmp = video_dir
        video_dir = os.path.join(root_dirs, video_dir)
        video_list = os.listdir(video_dir)
        for video in video_list:
            print(os.path.join(video_dir, video))
            image_list = os.listdir(os.path.join(video_dir, video))
            i_dir = os.path.join(video_dir, video, 'i')
            x_dir = os.path.join(video_dir, video, 'x')
            y_dir = os.path.join(video_dir, video, 'y')
            if not os.path.exists(i_dir):
                os.makedirs(i_dir)
            if not os.path.exists(x_dir):
                os.makedirs(x_dir)
            if not os.path.exists(y_dir):
                os.makedirs(y_dir)
            for image in image_list:
                classic = image.split('_')[0]
                cmd = 'mv %s %s'% (os.path.join(video_dir, video, image), os.path.join(video_dir, video, classic))
                if len(image.split('_')) > 1:
                    os.system(cmd)


if __name__ == '__main__':
    splitflow(root_path)

Python多进程opencv调用rtsp视频流(改进版)

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   test_cv.py    
@Contact :   476423448@qq.com
@License :   (C)Copyright 2020-2021, AIgroup-KPCQ

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
8/16/21 3:11 PM   gavin      1.0         None
'''

# import os
 
import gc
import abc
from multiprocessing import Process, Manager

import cv2


# 定义抽象基类,此类不能直接实例化
# 做好框架
# 其子类只用实现.process_image方法,返回任意图像算法处理后的从缓存栈中读取的图片
class ABVideoCapture(abc.ABC):
    def __init__(self, cam, top=100):
        self.stack = Manager().list()
        self.max_cache = top
        self.write_process = Process(target=self.__class__.write, args=(self.stack, cam, top))
        self.write_process.start()
        self.__read_gen = self.read_gen()

    @abc.abstractmethod
    def process_image(self, image):
        """
        对输入的图片进行处理并返回处理后的图片
        """

    def read_gen(self):
        while True:
            if len(self.stack) != 0:
                img = self.process_image(self.stack.pop())
                yield img

    def read(self):
        try:
            return True, next(self.__read_gen)
        except StopIteration:
            return False, None
        except TypeError:
            raise TypeError('{}.read_gen必须为生成器函数'.format(self.__class__.__name__))

    def __iter__(self):
        yield from self.__read_gen

    def release(self):
        self.write_process.terminate()

    def __del__(self):
        self.release()

    @staticmethod
    def write(stack, cam, top):
        """向共享缓冲栈中写入数据"""
        cap = cv2.VideoCapture(cam)
        while True:
            _, img = cap.read()
            if _:
                stack.append(img)
                # 每到一定容量清空一次缓冲栈
                # 利用gc库,手动清理内存垃圾,防止内存溢出
                if len(stack) >= top:
                    del stack[:]
                    gc.collect()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.release()


# 继承ABVideoCapture,对缓存栈中的图片不做处理直接返回
class VideoCapture(ABVideoCapture):
    def process_image(self, image):
        # 这里对图像的处理算法可以随意制定
        return image


if __name__ == '__main__':
    rtsp = 'rtsp://admin:kp123456@192.168.0.108:554/'
    camera_addr = rtsp

    cap = VideoCapture(camera_addr)
    while True:
        _, img = cap.read()
        if _:
            cv2.imshow('img', img)
            key = cv2.waitKey(1) & 0xFF
            if key == ord('q'):
                break

    cap.release()
    cv2.destroyAllWindows()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 二值图像: 一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。 2) 灰度图像: 灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。 3) 索引图像: 索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。 4) RGB彩色图像: RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。 4.图像数字化 通过取样和量化过程将一个以自然形式存在的图像变换为适合计算机处理的数字形式。图像在计算机内部被表示为一个数字矩阵,矩阵中每一元素称为像素。图像数字化需要专门的设备,常见的有各种电子的和光学的扫描设备,还有机电扫描设备和手工操作的数字化仪。图像编码。 对图像信息编码,以满足传输和存储的要求。编码能压缩图像的信息量,但图像质量几乎不变。为此,可以采用模拟处理技术,在通过模-数转换得到编码,不过多数是采用数字编码技术。编码方法有对图像逐点进行加工的方法,也有对图像施加某种变换或基于区域、特征进行编码的方法。脉码调制、微分脉码调制、预测码和各种变换都是常用的编码技术。 5.图像压缩 由数字化得到的一幅图像的数据量十分巨大,一幅典型的数字图像通常由500×500或1000×1000个像素组成。如果是动态图像,是其数据量更大。因此图像压缩对于图像的存储和传输都十分必要。 有两类压缩算法,即不失真的方法和近似的方法。最常用的不失真压缩取空间或时间上相邻像素值的差,再进行编码。游程码就是这类压缩码的例子。近似压缩算法大都采用图像交换的途径,例如对图像进行快速傅里叶变换或离散的余弦变换。著名的、已作为图像压缩国际标准的JPEG和MPEG均属于近似压缩算法。前者用于静态图像,后者用于动态图像。它们已由芯片实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值