Nao机器人的比赛中有一个Any Ball Detect。也就是在足球场地内,放置任意颜色的球,让机器人进行识别并射门。这里只讨论球的识别。我们知道,Nao机器人的处理能力有限,我们需要识别出任意的球,而事先又不知道球的颜色,看来得需要检查圆形了。又由于是在足球场地,所以背景的颜色也是知道的。

这里我们主要采用的就是将采集到得每一帧图像,将其背景设置为0 0 0。非背景设置为255然后采用霍夫变换检测圆形。这里要讨论一下Nao摄像头颜色空间的选择,BGR颜色空间受光照影响变化太大,基本上用阈值的话效果不好,尤其是对背景的去处的时候。在这里使用的是YUV颜色空间 Y:亮度,U:B分量,V:R分量。经过对比,如果只是使用阈值法的话,YUV在光照变化不是很大的情况下还是能够很好区别出不同的颜色信息。

其中在预处理后会采用高斯滤波来平滑图像。高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,我们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。于此相关的有Gauss-Lapplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。
 滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分,其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果(www.openbo.com)
 若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。

主要的方方法就是:YUV ->  Gary - > Gaussian - > cvHoughCircle - >得到圆形。 处理效果如下:

1、网上下载的图片:

  

2 、利用手机拍摄的球场图片:

         

3、Nao摄像头拍摄的球场图片:

        

从上图来看,基本可以实现对任意颜色的球的检查(当然与背景颜色不同相同)。在用Nao摄头拍摄时,最后的检查圆不是十分的准确,因为光照是时时刻刻在改变的,如果视频上你就会发现,标记出来的球的区域是随着时间变动的。其实这又引出来了又一个问题,即是怎样减少这种光照的影响,实现准确的检查。而在实验的过程中发现首先需要做的就是设置摄像头,在这之前,一直使用的是自动白平衡、自动增益、自动调整对比度,在这里自动会带来很多问题。你可以试试在默认自动调整摄像头的情况下,让Nao看者球场上的一个球,然后把一张白纸放人其视野里,会发现你所看到得图像的颜色会有较大的改变,而这是我们所不需要的。关于怎么设置摄像头,参数设置为多少需要通过实验来得到数据。

我采用的是在getimage 这个例程中直接实验的,所以最后的源程序是:

#include <alproxies/alvideodeviceproxy.h>
#include <alimage.h>
#include <alvisiondefinitions.h>
// Opencv includes.
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <string>
using namespace AL;
void showImages(const std::string& robotIp)
{
// Create a proxy to ALVideoDevice on the robot.
ALPtr<ALVideoDeviceProxy> camProxy = makeALPtr(new ALVideoDeviceProxy(robotIp, 9559));
// Subscribe a client image requiring 320*240 and BGR colorspace.
const std::string clientName = camProxy->subscribe("test", kQVGA, kYUVColorSpace, 30);
// Create an iplimage header to wrap into an opencv image.
IplImage* imgHeader = cvCreateImageHeader(cvSize(320, 240), 8, 3);
cvNamedWindow("images");
// Main loop. Exit when pressing ESC.
while (cvWaitKey(300) != 64)
{
// Retrieve an image from the camera.
ALValue img = camProxy->getImageRemote(clientName);
// Assign our image binary to the opencv image.
imgHeader->imageData = (char*)img[6].GetBinary();
// Display it on screen.
CvScalar pixel= {};
for (int i=0;i<imgHeader->height;i++)
{
for (int j=0;j<imgHeader->width;j++)
{
pixel=cvGet2D(imgHeader,i,j);
if (pixel.val[1]>115 && pixel.val[1]<150)
{
//recflag=1;
pixel.val[0]=0;
pixel.val[1]=0;
pixel.val[2]=0;
cvSet2D(imgHeader, i, j, pixel);
}
else
{
pixel.val[0]= 0 ;
pixel.val[1] = 255;
pixel.val[2] = 0;
cvSet2D(imgHeader, i, j, pixel);
}
}
}
IplImage* gray = cvCreateImage( cvGetSize(imgHeader), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor( imgHeader, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9,9); // smooth it, otherwise a lot of false circles may be detected
cvShowImage("hsi",gray);
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 30,5,50);
int i;
for( i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( imgHeader, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( imgHeader, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
cvNamedWindow( "circles", 1 );
cvShowImage( "circles", imgHeader );
cvShowImage("images", imgHeader);
}
// Cleanup.
camProxy->unsubscribe(clientName);
cvReleaseImageHeader(&imgHeader);
}
int main(int argc, char* argv[])
{
const std::string robotIp("192.168.1.148");
try
{
showImages(robotIp);
}
catch (const ALError& e)
{
std::cerr << "Caught exception " << e.what() << std::endl;
}
return 0;
}

如果想要使用这些程序,程序中的一些参数需要根据实际情况进行调整。

Nao机器人Any ball detect相关推荐

  1. NAO机器人高尔夫中的视觉系统设计

    去年(2017)年分别参加了江苏省和全国的NAO机器人高尔夫比赛,负责的是视觉部分编程.在这里把之前的工作总结一下.内容主要包括红球和黄杆的识别和定位(包括在比赛中遇到的一些问题和解决办法).完整的代 ...

  2. nao机器人国际比赛程序 python编写

    踢球程序 import datetime import sys import time import math import threading from naoqi import ALProxy i ...

  3. python控制nao机器人_python控制nao机器人身体动作实例详解

    本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下 今天读的代码,顺便写了出来,与文档的对比,差不多. import sys import motion im ...

  4. nao机器人行走速度_数计学院学子在2020世界机器人大赛总决赛中荣获佳绩!

    12月3日至6日,2020世界机器人大赛总决赛在佛山潭州国际会展中心举行.由武汉纺织大学数学与计算机学院何儒汉教授指导,杨皓然.成振瑞.李幸阜.伏嘉豪.李创等5名本科生同学组成的参赛团队荣获 2020 ...

  5. Nao机器人运行B-human代码之开始篇 1

    申明:既然在网上有介绍安装B-human软件的,我就不写了,在此转载.原文地址:http://www.cnblogs.com/followyourheart/archive/2012/03/12/B- ...

  6. Nao机器人运行B-human代码之基础篇

    1 安装ubuntu 最简单的方法,下载桌面版的Ubuntu10.10,解压或者是用虚拟光驱(推荐使用DAEMON)加载.运行wubi.exe,选择在window中安装,下一步,选择安装位置,一般选一 ...

  7. NAO机器人连接的电脑配置及用choregraphe控制nao行走

    1.安装python 1.1.网址https://www.python.org/downloads/,选择python2,下载安装并添加环境变量(此电脑右键-属性-高级系统设置-环境变量-编辑-新建- ...

  8. nao机器人学习笔记1

    nao机器人来到实验室有几个月了,之前对这个平台进行了熟悉并准备在此平台上实现一个足球机器人的功能.在学习时做了相关的 记录主要是熟悉nao的一些零散的东西,决定整理整理写出来. 关于python的一 ...

  9. Nao机器人如何实现视频监控

    最近发现群里有朋友在问如何实现Nao机器人视频监控,就写下这篇博客,希望能帮助到大家. 直入正题,法国Nao机器人如何实现视频监控,这里提供三种方式,第一种是基于socket传输的,第二种是使用ope ...

最新文章

  1. 网络爬虫流程与注意事项
  2. MongoDB 是如何鼓励和激励开发者社区的
  3. php编译减少大小,C++_减小VC6编译生成的exe文件的大小的方法,1、减小VC6编译生成的exe文件的 - phpStudy...
  4. ITK:观察事件 Observe An Event
  5. 页面上指定类型的控件的样式添加
  6. PYTHON得到pdf页数、遍历当前文件夹
  7. 2020江苏计算机二级考试官网,2020年秋季江苏省计算机等级考试报名通知
  8. org manual翻译--3.1 内置的表格编辑器
  9. NDK 下利用 arm-linux-androideabi-addr2line 定位 so 库问题点
  10. Android快速开发(2)
  11. python︱写markdown一样写网页,代码快速生成web工具:streamlit 数据探索案例(六)
  12. 【实物】端到端自动驾驶搭建教程(二)附完整资料
  13. LoadRunner函数的介绍
  14. 不怕面试再问HashMap,一次彻底地梳理(原理+手写实现)
  15. 时间管理—重要紧急四象限法则
  16. 华东师范 2018年 研究生复试上机题解合集
  17. 判断两个圆相切或相交
  18. MXNet -aws深度学习框架之选择
  19. 文件压缩zip(浏览器下载)
  20. 通信算法之三:LDPC码的研究

热门文章

  1. 六大设计原则之依赖倒置原则07
  2. 易语言怎么加密才不暴露服务器ip,如何实现服务器IP的隐藏
  3. 【用户画像】用户画像简介、用户画像的架构、搭建用户画像管理平台
  4. Java版贪食蛇游戏的设计与实现毕业设计
  5. CCNP的BGP部分笔记
  6. PCB相关知识-封装+元件属性+印制电路板PCB
  7. Android实现人脸识别动画效果
  8. 【hpuoj】防ak问题
  9. 色彩、印刷类重要网站
  10. 教你怎么给视频添加水印