之前做魔方机器人,使用的是人工输入默认的各个表面方块颜色分布,不够方便与智能,因此开始研究使用摄像头识别魔方。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实现魔方识别(一):边缘及位置识别相关推荐

  1. bp神经网络数字识别matlab_卷积神经网络学习识别手写数字时的可视化

    观看此神经网络了解在整个模型训练中可视化卷积层激活 Image by Sian Molloy 警告,该文章有不少大尺寸的图. 动机 与其他机器学习技术相比,深度学习的主要优势在于它能够自动学习输入数据 ...

  2. OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别

    连接:OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 Translate by Dawn ...

  3. c++/qt/opencv实现魔方复原【机器人应用】

    []@TOC 前言 本文主要实现使用Qt做软甲界面,opencv做魔方识别,本软件主要是配合机械手进行通信完成魔方的识别 机器人:ABB双臂机器人 效果视频 本软件效果如下: c++/opencv实现 ...

  4. 魔方机器人(二)颜色识别

    魔方机器人(二) 颜色识别 今天,就让我们来看看魔方的颜色识别是如何做到的.做图像处理的话我们可以用OpenCV(用到了颜色空间的转换RGB转HSV以及ROI区域提取),全称为Open Source ...

  5. 25.消除不相关的细节/裂缝桥接(形态学 --膨胀与腐蚀详解 )--- OpenCV从零开始到图像(人脸 + 物体)识别系列

    本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 形态 ...

  6. 21.失真/低高通/振铃效应/旁瓣泄漏效应/频域滤波/图像深度/频带/线性滤波源码分析 -- OpenCV从零开始到图像(人脸 + 物体)识别系列

    本文作者:小嗷 微信公众号:aoxiaoji 吹比QQ群:736854977 简书链接:https://www.jianshu.com/u/45da1fbce7d0 本文你会找到以下问题的答案: 失真 ...

  7. java opencv bp网_基于Opencv自带BP网络的车标简易识别

    记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和测试集准备 先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下, ...

  8. OpenCV使用Laplace运算符检测边缘的实例(附完整代码)

    OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 OpenCV使用Laplace运算符检测边缘的实例 #include "opencv2 ...

  9. OpenCV基于LeNet-5和连接组件分析的数字识别的实例(附完整代码)

    OpenCV基于LeNet-5和连接组件分析的数字识别的实例 OpenCV基于LeNet-5和连接组件分析的数字识别的实例 OpenCV基于LeNet-5和连接组件分析的数字识别的实例 #includ ...

最新文章

  1. 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
  2. 第二课.多元高斯分布与其几何特征
  3. ARM Cortex-M学习简介
  4. VS2012 +OpenCv2.4.4配置
  5. 工业以太网交换机在工厂环境中使用需要注意哪些问题?
  6. 前端学习(1260):promise中的常见api对象方法
  7. tomcat启动报错APR问题
  8. Angular Compile Error NG6002
  9. Go (Golang) 语言-快速开始
  10. RISC-V CPU设计(六)---四路组相联Cache的设计
  11. Redis:Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use
  12. Java多线程实现的两种方式
  13. Fidder 请求信息颜色的含义
  14. 【软件安装】MySQL8.0安装图文教程及可视化工具Navicat安装
  15. 异地多活场景下的数据同步之道
  16. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...
  17. python 单词翻译_Python翻译:我想在senten中翻译多个单词
  18. android:浏览器添加书签
  19. Delphi多线程详解
  20. 送4G金士顿U盘了,先到先得

热门文章

  1. c#学习记录之Indexof()
  2. AutoCAD阵列中实现编号递增
  3. 搭建一个nodejs项目 使用express
  4. 华为鸿蒙系统强势来袭,华为鸿蒙系统强势来袭,取其精华,去其糟粕!
  5. python correlate_如何解释numpy.correlate和numpy.corrcoef值?
  6. ERP水平测度指标及综合评价
  7. 使用UltralSO制作U盘启动
  8. 李兴华java8教程_李兴华Java培训系列详解20套视频教程下载
  9. 如何使用手机APP进行库房的库存管理
  10. C#_文件读写常用类介绍