python实时处理摄像头水稻种子图像标记并计数,根据相近的几个计数画出一个框,计算两个框之间的距离并将处理后的图片放在一个专门文件夹、信息汇总成表格,并写出代码
时间: 2024-03-06 18:49:59 浏览: 154
这个问题涉及到的内容比较多,需要分步骤来进行讲解。
## 1. 环境搭建
首先需要安装OpenCV和Pillow库,可以使用pip进行安装:
```
pip install opencv-python
pip install Pillow
```
## 2. 摄像头实时采集图像
使用OpenCV库中的VideoCapture类可以实时采集摄像头的图像:
```python
import cv2
cap = cv2.VideoCapture(0) # 0表示第一个摄像头
while True:
ret, frame = cap.read() # ret表示是否成功读取到图像,frame表示读取到的图像
if ret:
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'): # 按q键退出
break
cap.release()
cv2.destroyAllWindows()
```
## 3. 图像处理
对于水稻种子的图像处理,可以先使用Pillow库将图像转换成灰度图,再使用OpenCV库中的二值化和形态学处理函数进行图像增强:
```python
import cv2
from PIL import Image
# 读取图像
img = cv2.imread('image.jpg')
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# 形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
erode = cv2.erode(thresh, kernel, iterations=1)
dilate = cv2.dilate(erode, kernel, iterations=1)
# 显示处理后的图像
cv2.imshow('img', img)
cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
## 4. 标记水稻种子并计数
使用OpenCV库中的轮廓检测函数可以标记出水稻种子的位置,并使用len()函数计算出水稻种子的数量:
```python
import cv2
from PIL import Image
# 读取图像
img = cv2.imread('image.jpg')
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# 形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
erode = cv2.erode(thresh, kernel, iterations=1)
dilate = cv2.dilate(erode, kernel, iterations=1)
# 轮廓检测
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = len(contours)
# 标记水稻种子
for i in range(count):
x, y, w, h = cv2.boundingRect(contours[i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示处理后的图像
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
## 5. 计算两个框之间的距离并绘制框
使用OpenCV库中的distance()函数可以计算出两个框之间的距离,并使用cv2.rectangle()函数绘制出相邻框之间的连线:
```python
import cv2
from PIL import Image
# 读取图像
img = cv2.imread('image.jpg')
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# 形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
erode = cv2.erode(thresh, kernel, iterations=1)
dilate = cv2.dilate(erode, kernel, iterations=1)
# 轮廓检测
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = len(contours)
# 标记水稻种子
for i in range(count):
x, y, w, h = cv2.boundingRect(contours[i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 绘制相邻框之间的连线
for i in range(count - 1):
x1, y1, w1, h1 = cv2.boundingRect(contours[i])
x2, y2, w2, h2 = cv2.boundingRect(contours[i + 1])
cx1, cy1 = x1 + w1 // 2, y1 + h1 // 2
cx2, cy2 = x2 + w2 // 2, y2 + h2 // 2
cv2.rectangle(img, (x1, y1), (x1 + w1, y1 + h1), (0, 255, 0), 2)
cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 0), 2)
cv2.line(img, (cx1, cy1), (cx2, cy2), (0, 0, 255), 2)
# 显示处理后的图像
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
## 6. 信息汇总成表格
使用Pandas库可以将信息汇总成表格:
```python
import cv2
import pandas as pd
# 读取图像
img = cv2.imread('image.jpg')
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# 形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
erode = cv2.erode(thresh, kernel, iterations=1)
dilate = cv2.dilate(erode, kernel, iterations=1)
# 轮廓检测
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = len(contours)
# 计算相邻框之间的距离
distances = []
for i in range(count - 1):
x1, y1, w1, h1 = cv2.boundingRect(contours[i])
x2, y2, w2, h2 = cv2.boundingRect(contours[i + 1])
cx1, cy1 = x1 + w1 // 2, y1 + h1 // 2
cx2, cy2 = x2 + w2 // 2, y2 + h2 // 2
distance = ((cx2 - cx1) ** 2 + (cy2 - cy1) ** 2) ** 0.5
distances.append(distance)
# 汇总信息成表格
df = pd.DataFrame({'种子数量': [count], '相邻框距离': distances})
# 显示表格
print(df)
```
## 7. 完整代码
将以上步骤整合起来,得到完整代码如下:
```python
import cv2
import pandas as pd
# 读取图像
cap = cv2.VideoCapture(0)
ret, img = cap.read()
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# 形态学处理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
erode = cv2.erode(thresh, kernel, iterations=1)
dilate = cv2.dilate(erode, kernel, iterations=1)
# 轮廓检测
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = len(contours)
# 计算相邻框之间的距离
distances = []
for i in range(count - 1):
x1, y1, w1, h1 = cv2.boundingRect(contours[i])
x2, y2, w2, h2 = cv2.boundingRect(contours[i + 1])
cx1, cy1 = x1 + w1 // 2, y1 + h1 // 2
cx2, cy2 = x2 + w2 // 2, y2 + h2 // 2
distance = ((cx2 - cx1) ** 2 + (cy2 - cy1) ** 2) ** 0.5
distances.append(distance)
# 标记水稻种子
for i in range(count):
x, y, w, h = cv2.boundingRect(contours[i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 绘制相邻框之间的连线
for i in range(count - 1):
x1, y1, w1, h1 = cv2.boundingRect(contours[i])
x2, y2, w2, h2 = cv2.boundingRect(contours[i + 1])
cx1, cy1 = x1 + w1 // 2, y1 + h1 // 2
cx2, cy2 = x2 + w2 // 2, y2 + h2 // 2
cv2.rectangle(img, (x1, y1), (x1 + w1, y1 + h1), (0, 255, 0), 2)
cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 0), 2)
cv2.line(img, (cx1, cy1), (cx2, cy2), (0, 0, 255), 2)
# 显示处理后的图像
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 汇总信息成表格
df = pd.DataFrame({'种子数量': [count], '相邻框距离': distances})
# 显示表格
print(df)
# 保存处理后的图像
cv2.imwrite('result.jpg', img)
cap.release()
```
阅读全文