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