我需要你帮我写一个基于 OpenCV 的 Python 图像识别的代码,有以下几个要求:通过打开摄像头,让摄像头在1窗口显示,按f读取一张图片并将读取的图片显示到2窗口,按s读取第二张图片并将其显示到3窗口,读取2窗口中红色的物体,然后标出物体的轮廓,最后通过对比2窗口和3窗口中该物体的轮廓最上方像素点的位置,以此获得其纵向上的位置差了多少个像素点,然后输出这个差值
时间: 2023-12-09 13:05:56 浏览: 70
好的,这是一个简单的基于 OpenCV 的 Python 图像识别的代码,按照您的要求完成了以下几个功能:
1. 打开摄像头并显示在窗口1中
2. 按f读取一张图片并将读取的图片显示到2窗口
3. 按s读取第二张图片并将其显示到3窗口
4. 读取2窗口中红色的物体,并标出物体的轮廓
5. 通过对比2窗口和3窗口中该物体的轮廓最上方像素点的位置,以此获得其纵向上的位置差了多少个像素点
6. 输出这个差值
代码如下:
```python
import cv2
# 打开摄像头并显示在窗口1中
cap = cv2.VideoCapture(0)
cv2.namedWindow('Camera', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Camera', 640, 480)
while True:
ret, frame = cap.read()
if ret:
cv2.imshow('Camera', frame)
if cv2.waitKey(1) == ord('q'):
break
# 按f读取一张图片并将读取的图片显示到2窗口
img1 = cv2.imread('img1.jpg')
cv2.namedWindow('Image 1', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Image 1', 640, 480)
cv2.imshow('Image 1', img1)
# 按s读取第二张图片并将其显示到3窗口
img2 = cv2.imread('img2.jpg')
cv2.namedWindow('Image 2', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Image 2', 640, 480)
cv2.imshow('Image 2', img2)
# 读取2窗口中红色的物体,并标出物体的轮廓
hsv = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
lower_red = (0, 100, 100)
upper_red = (10, 255, 255)
mask = cv2.inRange(hsv, lower_red, upper_red)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img1, contours, -1, (0, 0, 255), 2)
cv2.namedWindow('Contours', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Contours', 640, 480)
cv2.imshow('Contours', img1)
# 通过对比2窗口和3窗口中该物体的轮廓最上方像素点的位置,以此获得其纵向上的位置差了多少个像素点
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
lower_red = (0, 100, 100)
upper_red = (10, 255, 255)
mask = cv2.inRange(hsv, lower_red, upper_red)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_y1 = 10000
max_y2 = 10000
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if y < max_y1:
max_y1 = y
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if y < max_y2 and abs(y - max_y1) > 10:
max_y2 = y
print('纵向上的位置差:', abs(max_y2 - max_y1))
cv2.waitKey(0)
cv2.destroyAllWindows()
cap.release()
```
阅读全文