表尺上的重心刻度"/>
求激光在表尺上的重心刻度
求激光在表尺上的重心刻度
- 一、问题描述
- 二、求解步骤和代码展示
- 1.将视频每20帧抽取一张图片
- 2.将每张图片灰度化并且垂直投影为二值化图片
- 总结
一、问题描述
求解激光的实时位移偏移情况,通过表尺来确定精准坐标。
二、求解步骤和代码展示
1.将视频每20帧抽取一张图片
代码如下(示例):
'''''main文件用于将视频每%帧取一张照片'''''import cv2
import logging# 打印日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')#设定图片存放位置以及其编号num
def save_image(num, image):image_path = './picture/{}.jpg'.format(str(num))cv2.imwrite(image_path, image)file_path = './1.MP4'vc = cv2.VideoCapture(file_path)# 确认videocapture是否捕捉到视频
if vc.isOpened():ret, frame = vc.read()
else:ret = Falsecount = 0 # 多少张照片
frame_interval = 20 # 多少帧抽取一张照片
frame_interval_count = 0while ret:ret, frame = vc.read()# store operation every time f frameif frame_interval_count % frame_interval == 0:save_image(count, frame)logging.info("num:" + str(count) + ", frame: " +str(frame_interval_count))count += 1frame_interval_count += 1cv2.waitKey(1)vc.release()
2.将每张图片灰度化并且垂直投影为二值化图片
z由于我要处理的数据是单一颜色图片的数据,所以我将图片先处理为灰度图,这样激光的绿色就可以成为区分点,且为白色,这样方便后去进行处理,可以很方便得到坐标并且将其垂直投影到X轴,通过一个像素点就加权255,这样就可以后续通过平均权重求出重心坐标了。
代码如下(示例):
import os, sys
import cv2
import matplotlib.pyplot as plt
# 打开文件
path = "./picture"
dirs = os.listdir(path)# 输出所有文件和文件夹
for file in dirs:image_path = './picture/{}'.format(file)#print(file)image = cv2.imread(image_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# ret, img = cv2.threshold(gray, 160, 255, cv2.THRESH_BINARY)ret, img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
对图片转化完就开始处理图像数据了
# 垂直投影二值化图片def vProject(binary):h, w = binary.shape# 创建 w 长度都为0的数组w_w = [0] * wsum1 = [0] * wrate = 0sum = 0sumw = 0#计算权重求出平均坐标for i in range(w):for j in range(h):if binary[j, i] == 255:w_w[i] += 255if w_w[i] != 0:sum1[i] += w_w[i] * isum += w_w[i]#rate为输出for i in range(w):sumw += sum1[i]rate = sumw / sumprint(rate)#plt.plot(range(w), w_w)#plt.show()# return w_wvProject(img)
处理的各个阶段图片:
总结
了解图片处理的基本操作,学习了对视频的去帧,对图片转换,将图片处理后的数据进行处理。总的来说是一次很好的锻炼
代码百度云链接:
链接:
提取码:s22p
更多推荐
求激光在表尺上的重心刻度
发布评论