2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-附录树莓派opencv调用摄像头bug的解决,链接在文末

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队
针对于本赛题,本团队采用树莓派4B做出主控。但是,不少人在使用树莓派去利用opencv调用CSI摄像头的时候,往往会遇到下列问题:

首先,树莓派官网系统更新到bulleye后(之前是Buster),raspistill是不可用的,只能用libcamera-hello。其次在raspi-config里,必须要开启摄像头使能,但是要注意!如果你不修改/boot/config.txt的话,你的libcamera-hello是用不了的!!!你必须在configtxt里加上dtoverlay=ov5647!当然这也是笔者踩坑的开始,因为只要你加入了dtoverlay=ov5647,你的opencv大概率就打不开摄像头了!
后来,经过与官方客服的交流,得知是由于系统更新的问题,烧录2021的Buster系统,即可完美解决,树莓派Opencv调用摄像头的问题。

附上可以直接使用的系统链接

树莓派Opencv调用摄像头

2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的竞学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV 视觉检测程序方案源码2024 E 高鲁棒性 三子盘&OpenCV
### 在树莓派上使用 OpenCV 实现三子游戏 要在树莓派上使用 OpenCV 实现三子游戏,可以遵循以下方法和技术要点: #### 1. **环境配置** 为了确保 OpenCV 正确运行并能够访问摄像头,需先完成必要的系统设置和库安装。 - 更新树莓派操作系统至最新版本,并启用摄像头支持: ```bash sudo apt update && sudo apt upgrade -y sudo raspi-config ``` 在 `raspi-config` 中选择 “Interfacing Options”,然后启用 Camera 功能。完成后重启设备[^3]。 - 安装依赖项和 OpenCV 库: ```bash sudo apt install python3-opencv libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libatlas-base-dev gfortran cmake git wget unzip build-essential ``` - 如果遇到摄像头无法正常工作的错误(如 `libcamera-hello` 或者 OpenCV 的兼容性问),可尝试降级到 Buster 系统或者调整 `/boot/config.txt` 文件以适配硬件驱动程序[^3]。 --- #### 2. **图像采集与预处理** 通过摄像头捕获实时画面,并对其进行初步处理以便提取盘信息。 - 使用 PythonOpenCV 获取视频流: ```python import cv2 cap = cv2.VideoCapture(0) # 默认摄像头索引为0 while True: ret, frame = cap.read() if not ret: break gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰度图便于后续操作 blurred_frame = cv2.GaussianBlur(gray_frame, (5, 5), 0) # 高斯模糊减少噪声影响 cv2.imshow('Chessboard', blurred_frame) key = cv2.waitKey(1) & 0xFF if key == ord('q'): break cap.release() cv2.destroyAllWindows() ``` - 对于特定型号的摄像头(如 OV5647),可能需要额外参数才能稳定工作。如果默认方式失败,则可以通过命令行测试连接状态[^3]: ```bash libcamera-still -o test.jpg --immediate ``` --- #### 3. **盘识别** 基于预处理后的图片定位盘区域及其内部单元格位置。 - 利用边缘检测算法找到矩形轮廓代表整个盘边界: ```python edges = cv2.Canny(blurred_frame, threshold1=50, threshold2=150) contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contour = max(contours, key=cv2.contourArea) # 寻找面积最大的闭合图形即为目标盘范围 epsilon = 0.1 * cv2.arcLength(contour, closed=True) approx = cv2.approxPolyDP(contour, epsilon, closed=True) if len(approx) == 4: # 只有四边形才可能是有效盘 points = np.float32([approx[i][0] for i in range(len(approx))]) warped_image = four_point_transform(frame, points) # 将倾斜视角矫正为正视图 ``` - 函数定义用于执行透视变换: ```python def four_point_transform(image, pts): rect = order_points(pts) (tl, tr, br, bl) = rect widthA = distance_between(br, bl) widthB = distance_between(tr, tl) maxWidth = max(int(widthA), int(widthB)) heightA = distance_between(tr, br) heightB = distance_between(tl, bl) maxHeight = max(int(heightA), int(heightB)) dst = np.array([ [0, 0], [maxWidth - 1, 0], [maxWidth - 1, maxHeight - 1], [0, maxHeight - 1]], dtype="float32") M = cv2.getPerspectiveTransform(rect, dst) return cv2.warpPerspective(image, M, (maxWidth, maxHeight)) def order_points(pts): ... ``` --- #### 4. **子分类与状态跟踪** 针对每个网格内的对象进行颜色区分或形状匹配从而判断当前占据情况。 - 结合 HSV 色彩空间分离不同类型的子像素分布特征: ```python hsv_img = cv2.cvtColor(warped_image, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 100, 100]) upper_red = np.array([10, 255, 255]) red_mask = cv2.inRange(hsv_img, lower_red, upper_red) kernel = np.ones((5, 5), 'uint8') cleaned_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel) _, labels, stats, centroids = cv2.connectedComponentsWithStats(cleaned_mask) filtered_stats = [(i, s) for i, s in enumerate(stats) if s[cv2.CC_STAT_AREA] >= min_area] positions = [] for idx, stat in filtered_stats: x, y, w, h, area = stat center_x = int(x + w / 2) center_y = int(y + h / 2) positions.append(((center_x, center_y), "Red")) ``` - 若存在误判现象可通过引入 NMS 技术进一步优化结果质量[^4]。 --- #### 5. **逻辑决策与动作规划** 综合以上获取的信息设计 AI 下一步行动策略并通过机械臂完成相应物理移动。 ```python def decide_next_move(board_state): pass def control_servos(target_position): pass ``` 最终形成闭环控制系统使得机器具备自主思考能力并与玩家交互直至比结束为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值