python 代码段

本文详细介绍如何使用Python的Base64模块进行图像文件的编码和解码,将其转换为OpenCV和PIL.Image格式。同时,展示了如何利用Caffe进行深度学习模型的运行和中间层数据的获取,以及OpenCV在视频读写和图像融合方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rapidjson

配置log

import logging

logging.basicConfig(
    filename='down_img.log',
    format='[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
           '[%(levelname)s]: %(message)s',  # '%(asctime)s -%(name)s-%(levelname)s-%(module)s:%(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    level=logging.INFO
)

slog = logging.getLogger("down_img")

try:
    result = future.result()
    slog.info("info{} ok.".format(info))
except Exception as exc:
    slog.warn("info {} exc: {}".format(info, exc))

二进制打开图片文件,base64编解码,转成Opencv格式:

# coding: utf-8
import base64
import numpy as np
import cv2
 
img_file = open('00.JPG','rb')   # 二进制打开图片文件
img_b64encode = base64.b64encode(img_file.read())  # base64编码
img_file.close()  # 文件关闭
img_b64decode = base64.b64decode(img_b64encode)  # base64解码

# base64 to OpenCV
img_array = np.fromstring(img_b64decode,np.uint8) # 转换np序列
img=cv2.imdecode(img_array,cv2.COLOR_BGR2RGB)  # 转换Opencv格式

# OpenCV to base64
data = cv2.imread(file_path)
img_encode = cv2.imencode(".jpg", data)[1]
imgb64s = base64.b64encode(img_encode)

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

# 再写回文件格式
file_t = open('1.jpg','wb')
file_t.write(img_b64decode )
file_t.close()

python base64编码

Python base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他们8个可以两两分为4组,

  • encode,decode一组,专门用来编码和解码文件的,也可以对StringIO里的数据做编解码
  • encodestring,decodestring一组,专门用来编码和解码字符串
  • b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。这个最常用
  • urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。
# coding: utf-8  
import base64  
import StringIO  
a = "this is a test"
b = base64.encodestring(a) # 对字符串编码  
print b  
print base64.decodestring(b) # 对字符串解码  
c = StringIO.StringIO()  
c.write(a)  
d = StringIO.StringIO()  
e = StringIO.StringIO()  
c.seek(0)  
base64.encode(c, d) # 对StringIO内的数据进行编码  
print d.getvalue()  
d.seek(0)  
base64.decode(d, e) # 对StringIO内的数据进行解码  
print e.getvalue()  
a = "this is a +test"
b = base64.urlsafe_b64encode(a) # 进行url的字符串编码  
print b  
print base64.urlsafe_b64decode(b) 

#encode函数和decode函数的参数也可以是文件对象
f1 = open('aaa.txt', 'r')  
f2 = open('bbb.txt', 'w')  
base64.encode(f1, f2)  
f1.close()  
f2.close()

二进制打开图片文件,base64编解码,转成PIL.Image格式:

# coding: utf-8
# python base64编解码,转换成Opencv,PIL.Image图片格式
import base64
import io
from PIL import Image
 
img_file = open('./img/01.jpg','rb')   # 二进制打开图片文件
img_b64encode = base64.b64encode(img_file.read())  # base64编码
img_file.close()  # 文件关闭
img_b64decode = base64.b64decode(img_b64encode)  # base64解码
 
image = io.BytesIO(img_b64decode)
img = Image.open(image)
img.show()

# array转换成image
Image.fromarray(np.uint8(img))

计算耗时

start = time.time()
run_fun()
end = time.time()
print end-start

caffe run

caffe 代码例子和输出中间层数据:https://blog.youkuaiyun.com/Jesse_Mx/article/details/58605385
caffe代码例子:https://www.cnblogs.com/zf-blog/p/6210521.html

# caffe 读入文件方式
def test_fun():
    net = caffe.Net(model_def, model_weights, caffe.TEST)

    transformer = caffe.io.Transformer({'data': net.blobs['data_img'].data.shape})
    transformer.set_transpose('data', (2, 0, 1))
    # transformer.set_mean('data', mean_value)
    transformer.set_raw_scale('data', 255)
    transformer.set_channel_swap('data', (2, 1, 0))

    f = open("new.jpg", "rb")
    img_array = np.asarray(bytearray(f.read()), dtype=np.uint8)
    # TODO cv 转换数据存在问题。
    img_decode = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
    img_resize = cv2.resize(img_decode, (320, 240))

    # net.blobs['data_img'].reshape(1, 3, 240, 320)

    transformed_image = transformer.preprocess('data', skimage.img_as_float(img_decode))

    net.blobs['data_img'].data[...] = transformed_image
    output = net.forward()
    output = output['net_output']
    output


def caffe_io_run():
    net = caffe.Net(model_def, model_weights, caffe.TEST)

    img_resize = caffe.io.load_image("./new.jpg", True)

    transformer = caffe.io.Transformer({'data': net.blobs['data_img'].data.shape})
    transformer.set_transpose('data', (2, 0, 1))
    # transformer.set_mean('data', mean_value)
    transformer.set_raw_scale('data', 255)

    transformed_image = transformer.preprocess('data', skimage.img_as_float(img_resize))

    net.blobs['data_img'].data[...] = transformed_image
    output = net.forward()
    output = output['net_output']
    output

检测tf训练可用设备

用如下代码可检测tensorflow的能使用设备情况:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices()) 

可以看到tf可用的设备,如果没有GPU说明是版本的问题,需要修改tf的版本适应GPU的驱动

原文:https://www.cnblogs.com/hutao722/p/9583214.html

OpenCV 读视频,写视频

video_path = "D:/aaa/11.mp4"

cap = cv2.VideoCapture(video_path)
frame_w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
all_frame_num = cap.get(cv2.CAP_PROP_FRAME_COUNT)

fout = cv2.VideoWriter(
    video_path + "tt.mp4",
    cv2.VideoWriter_fourcc(*'mp4v'),
    fps,
    (frame_w, frame_h),
    True
)

i_frame = 0
while cap.isOpened():
    ret, frame = cap.read()
    i_frame += 1

    if not ret:
        print("end {}/{}".format(i_frame, all_frame_num))
        break

    cv2.putText(frame, "aaaa", (30, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,0,255))
    print("{}/{}".format(i_frame, all_frame_num))
    fout.write(frame)

    if i_frame > 1000:
        break

    cv2.imshow("video", frame)
    cv2.waitKey(1)

fout.release()
cap.release()
cv2.destroyAllWindows()

OpenCV 融合 (seamless_cloning)


def merge_image_by_mask(img_src, img_mask, img_dst):
    # img1 = cv2.imread('img.jpg')
    # img2 = cv2.imread('img2.jpg')
    # alpha = 0.5
    # meta = 1 - alpha
    # gamma = 0
    # dst = cv2.addWeighted(img1,alpha,img2,meta,gamma)  # (img1,0.7,img2,0.3,0)
    # cv2.imshow('dst',dst)
    # cv2.waitKey(0)

    img1 = cv2.imread("D:/bbb/234452.jpg")
    img2 = cv2.imread("D:/bbb/ae_15.jpg")
    roi = [44, 2, 144, 130]
    img2 = img2[roi[1]:roi[3], roi[0]:roi[2]]

    cv2.imshow("img1", img1)
    cv2.imshow("img2", img2)

    img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    # 感兴趣的区域值为255
    ret, mask = cv2.threshold(img2gray, 50, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)
    print("ret:", ret)

    # cv2.imshow("mask", mask)

    img_fg = cv2.bitwise_and(img2, img2, mask=mask)
    # cv2.imshow("fg", img_fg)

    img1roi = img1[roi[1] + 10:roi[3] + 10, roi[0] + 50:roi[2] + 50]
    img_bg = cv2.bitwise_and(img1roi, img1roi, mask=mask_inv)
    # cv2.imshow("bg", img_bg)

    dst1 = cv2.add(img_fg, img_bg)

    img1[roi[1] + 10:roi[3] + 10, roi[0] + 50:roi[2] + 50] = dst1
    cv2.imshow("res", img1)

    cv2.waitKey(0)


def merge_image(img_src, roi_rect: list, img_dst):
    """
    根据roi矩形框,把原图片的感兴趣区域图片随机贴到目标图片上
    :param img_src: 原图片
    :param roi_rect: 原图片感兴趣区域  left, up, right, down
    :param img_dst: 目标图片
    :return:
    """
    roi_rows, roi_cols = roi_rect[3] - roi_rect[1], roi_rect[2] - roi_rect[0]

    rows_src, cols_src, channels1 = img_src.shape
    rows_dst, cols_dst, channels2 = img_dst.shape

    if roi_rect[0] >= cols_src or roi_rect[1] >= rows_src:
        """ 判断roi范围是否超出图片大小 """
        return Exception("error roi postion.")

    if roi_cols == 0 or roi_rows == 0:
        """ 判断roi范围是否为0 """
        return Exception("error roi size.")

    if roi_rows > rows_dst or roi_cols > cols_dst:
        """ 判断roi范围是否超出了目标图片大小 """
        return Exception("error roi size bigger dst image size.")

    rows_idx = random.randint(0, rows_dst - roi_rows)
    cols_idx = random.randint(0, cols_dst - roi_cols)

    # [rows, cols]
    img_dst[rows_idx:rows_idx + roi_rows, cols_idx:cols_idx + roi_cols] = \
        img_src[roi_rect[1]:roi_rect[3], roi_rect[0]:roi_rect[2]]

    return img_dst, cols_idx, rows_idx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值