使用Opencv实现魔方识别(一):边缘及位置识别
之前做魔方机器人,使用的是人工输入默认的各个表面方块颜色分布,不够方便与智能,因此开始研究使用摄像头识别魔方。Opencv基本是首选而且方便简单的工具。本文将描述如何使用Opencv识别从摄像头抓取的魔方图片内魔方的各个方块边缘以及位置,用于后续的颜色的识别。
安装opencv
Pycharm支持从界面选择安装python包,在文件菜单下选择设置项,然后如下图找到安装界面:
需要用到的安装包列表:numpy,Matplotlib,opencv-python
边缘检测
从摄像头抓取的原图如下:
灰化去除颜色信息
代码:
import cv2
import numpy as np
from copy import deepcopy
import mathimgobj = cv2.imread('1.jpg')
gray = cv2.cvtColor(imgobj, cv2.COLOR_BGR2GRAY)
cv2.namedWindow("image")
cv2.imshow("image", gray)
cv2.waitKey(0)
效果如下:
高斯模糊扩大边缘效果
代码:
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
cv2.imshow("image", blurred)
cv2.waitKey(0)
效果如下:
Canny算法实现边缘检测
Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。具体可以参考:
https://en.wikipedia.org/wiki/Canny_edge_detector
代码:
canny = cv2.Canny(blurred, 20, 40)
cv2.imshow("image", canny)
cv2.waitKey(0)
效果如下:
边缘线膨胀化
canny检测的边缘线很细,使得同一边缘有多个边缘线,这里可以用opencv dilate函数,使边缘线膨胀化,这样同一边缘的多个边缘线即可合并成同一条线。
代码:
kernel = np.ones((3,3), np.uint8)
dilated = cv2.dilate(canny, kernel, iterations=2)
cv2.imshow("image", blurred)
cv2.waitKey(0)
效果如下:
去除多余边缘
膨胀化后,可以看到很多魔方外的物体边缘,以及魔方内的小边缘,这些都需要去除。通过计算闭合边缘的面积以及中心点的位置,可以判断出哪些是魔方的边缘,哪些是多余的边缘。
在计算面积与中心点时,需要对闭合边缘使用approxPolyDP函数进行多变拟合。findContours为遍历提取所有的闭合区域,arcLength为计算闭合区域的周长,contourArea计算闭合区域的面积。
代码:
(contours, hierarchy) = cv2.findContours(dilated.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)candidates = []
hierarchy = hierarchy[0]index = 0
pre_cX = 0
pre_cY = 0
center = []
for component in zip(contours, hierarchy):contour = component[0]peri = cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, 0.1 * peri, True)area = cv2.contourArea(contour)corners = len(approx)# compute the center of the contourM = cv2.moments(contour)if M["m00"]:cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])else:cX = NonecY = Noneif 14000 < area < 20000 and cX is not None:tmp = {'index': index, 'cx': cX, 'cy': cY, 'contour': contour}center.append(tmp)index += 1center.sort(key=lambda k: (k.get('cy', 0)))
row1 = center[0:3]
row1.sort(key=lambda k: (k.get('cx', 0)))
row2 = center[3:6]
row2.sort(key=lambda k: (k.get('cx', 0)))
row3 = center[6:9]
row3.sort(key=lambda k: (k.get('cx', 0)))center.clear()
center = row1 + row2 + row3for component in center:candidates.append(component.get('contour'))cv2.drawContours(imgobj, candidates, -1, (0, 0, 255), 3)
cv2.imshow("image", imgobj)
cv2.waitKey(0)
效果如下:
通过效果图,对于魔方的边缘及位置识别基本正确,后续即可对识别区域内的颜色进行分析,会在后续文章中进行。
使用Opencv实现魔方识别(一):边缘及位置识别相关推荐
- bp神经网络数字识别matlab_卷积神经网络学习识别手写数字时的可视化
观看此神经网络了解在整个模型训练中可视化卷积层激活 Image by Sian Molloy 警告,该文章有不少大尺寸的图. 动机 与其他机器学习技术相比,深度学习的主要优势在于它能够自动学习输入数据 ...
- OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别
连接:OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 Translate by Dawn ...
- c++/qt/opencv实现魔方复原【机器人应用】
[]@TOC 前言 本文主要实现使用Qt做软甲界面,opencv做魔方识别,本软件主要是配合机械手进行通信完成魔方的识别 机器人:ABB双臂机器人 效果视频 本软件效果如下: c++/opencv实现 ...
- 魔方机器人(二)颜色识别
魔方机器人(二) 颜色识别 今天,就让我们来看看魔方的颜色识别是如何做到的.做图像处理的话我们可以用OpenCV(用到了颜色空间的转换RGB转HSV以及ROI区域提取),全称为Open Source ...
- 25.消除不相关的细节/裂缝桥接(形态学 --膨胀与腐蚀详解 )--- OpenCV从零开始到图像(人脸 + 物体)识别系列
本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 形态 ...
- 21.失真/低高通/振铃效应/旁瓣泄漏效应/频域滤波/图像深度/频带/线性滤波源码分析 -- OpenCV从零开始到图像(人脸 + 物体)识别系列
本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 失真 ...
- java opencv bp网_基于Opencv自带BP网络的车标简易识别
记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和测试集准备 先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下, ...
- OpenCV使用Laplace运算符检测边缘的实例(附完整代码)
OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 #include "opencv2 ...
- OpenCV基于LeNet-5和连接组件分析的数字识别的实例(附完整代码)
OpenCV基于LeNet-5和连接组件分析的数字识别的实例 OpenCV基于LeNet-5和连接组件分析的数字识别的实例 OpenCV基于LeNet-5和连接组件分析的数字识别的实例 #includ ...
最新文章
- 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
- 第二课.多元高斯分布与其几何特征
- ARM Cortex-M学习简介
- VS2012 +OpenCv2.4.4配置
- 工业以太网交换机在工厂环境中使用需要注意哪些问题?
- 前端学习(1260):promise中的常见api对象方法
- tomcat启动报错APR问题
- Angular Compile Error NG6002
- Go (Golang) 语言-快速开始
- RISC-V CPU设计(六)---四路组相联Cache的设计
- Redis:Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use
- Java多线程实现的两种方式
- Fidder 请求信息颜色的含义
- 【软件安装】MySQL8.0安装图文教程及可视化工具Navicat安装
- 异地多活场景下的数据同步之道
- python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...
- python 单词翻译_Python翻译:我想在senten中翻译多个单词
- android:浏览器添加书签
- Delphi多线程详解
- 送4G金士顿U盘了,先到先得
热门文章
- c#学习记录之Indexof()
- AutoCAD阵列中实现编号递增
- 搭建一个nodejs项目 使用express
- 华为鸿蒙系统强势来袭,华为鸿蒙系统强势来袭,取其精华,去其糟粕!
- python correlate_如何解释numpy.correlate和numpy.corrcoef值?
- ERP水平测度指标及综合评价
- 使用UltralSO制作U盘启动
- 李兴华java8教程_李兴华Java培训系列详解20套视频教程下载
- 如何使用手机APP进行库房的库存管理
- C#_文件读写常用类介绍