python实时处理摄像头水稻种子图像标记并计数,根据相近的几个计数画出一个框,计算两个框之间的距离并将处理后的图片放在一个专门文件夹、信息汇总成表格,并写出代码
时间: 2024-03-02 16:53:22 浏览: 143
使用 python 进行图像处理【100011731】
好的,下面是一个基于OpenCV的完整代码,实现了摄像头拍摄水稻种子图像标记计数、框选、距离计算、图像保存和表格汇总功能:
```python
import cv2
import numpy as np
import pandas as pd
# 打开摄像头
cap = cv2.VideoCapture(0)
# 定义窗口
cv2.namedWindow('image')
# 定义参数
count = 0
boxes = []
# 循环处理每一帧图像
while True:
# 读取一帧图像
ret, img = cap.read()
# 将图像转化为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 阈值分割
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 形态学操作
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 轮廓检测
contours, hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓并计算种子数量
count = 0
for cnt in contours:
if cv2.contourArea(cnt) < 50:
continue
count += 1
(x, y, w, h) = cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 聚类操作
clusters = []
for cnt in contours:
if cv2.contourArea(cnt) < 50:
continue
moments = cv2.moments(cnt)
center_x = int(moments['m10'] / moments['m00'])
center_y = int(moments['m01'] / moments['m00'])
clusters.append((center_x, center_y))
# 计算距离并绘制框
def draw_box(img, box, color):
(x1, y1, x2, y2) = box
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
boxes = []
for i in range(len(clusters)):
for j in range(i+1, len(clusters)):
dist = np.sqrt((clusters[i][0]-clusters[j][0])**2 + (clusters[i][1]-clusters[j][1])**2)
if dist < 50:
box = (min(clusters[i][0], clusters[j][0]), min(clusters[i][1], clusters[j][1]),
max(clusters[i][0], clusters[j][0]), max(clusters[i][1], clusters[j][1]))
boxes.append(box)
for box in boxes:
draw_box(img, box, (0, 0, 255))
# 显示图像
cv2.imshow('image', img)
# 等待按键操作
key = cv2.waitKey(1)
# 如果按下's'键,保存处理后的图像和表格,并退出循环
if key == ord('s'):
# 保存处理后的图像
cv2.imwrite('processed_rice_seed.jpg', img)
# 将信息汇总成表格
data = {'Seed Count': [count], 'Box Count': [len(boxes)]}
df = pd.DataFrame(data)
# 保存表格
df.to_csv('result.csv', index=False)
break
# 关闭窗口和摄像头
cv2.destroyAllWindows()
cap.release()
```
在本代码中,我们首先打开摄像头,并定义了一个窗口来显示摄像头拍摄到的图像。然后,我们在循环中不断读取摄像头拍摄到的每一帧图像,并对图像进行阈值分割、形态学操作和轮廓检测,得到了二值化的种子图像和种子的轮廓。接着,我们计算了种子数量和种子的中心点,并进行了聚类操作,计算相邻种子之间的距离,如果距离小于50,则将这两个种子框选在同一个框内,并绘制框。最后,在按下's'键时,我们将处理后的图像保存为文件,并将计数结果汇总成表格并保存。
阅读全文