Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 17

本科生毕业论文(设计)

题目:基于 python 开发的图像  


采集器之 Airppt             
学 部
学科门类
专 业
基于 python 开发的图像采集器之 Airppt
摘    要
本文设计了一个基于 python 开发的图像采集器,该设计通过普通的 USB 数字摄
像头来捕捉和获取实时图像,利用 linux 系统下的 python 脚本中的 Opencv 图像
处理模块和 Huigui 摄像头识别模块实现了采集图像信息并对图像信息进行分析
的功能,该设计具有可靠性高、灵活稳定、低成本的特点,基于 python 开发的
图像采集器将采集到的数据输入到 python 脚本进行分析处理,并从外部引入 C
编程,根据不同的处理结果,系统将会调用不同的 C 程序,从而实现对 ppt 的
翻页。本文系统介绍了用 python 开发的图像采集器基本满足设计要求。
关键词:图像采集器;Python 语言;Python C 扩展;混合语言编程

Development the image acquisition based on python

ABSTRACT
Design one based on python development of image capture device, the design by
ordinary USB digital camera head to capture and access to real-time image using
python script in linux system Opencv image processing module and Huigui camera
head identification module to achieve the capture image informationand image
information analysis function, the design has high reliability, flexible and stable, low-
cost, will be collected based on the the python development of image acquisition
data input to a python script analysis and processing, from the outside to the
introduction of the C programming, depending on the processing results, the system
will call the C program, in order to achieve the next page of ppt. We introduce the
basic meet the design requirements with the the python development of image
acquisition.
Key words : Image acquisition ; Python ; Python C extension ; Mixed-language
programming

目    录
2.2  Python 语言特性    4
    3  设计思路和编程    5
    3.1  设计思路     5
    3.2  设计流程图     5
3.3  编程     6
    3.3.1  Opencv 模块引用     6
    3.3.2  Highgui 模块引用     6
3.3.3  Image 模块引用     6
3.3.4  Os 模块引用     6
    3.4  python 与 C 混合编程接口问题     6  
1引言
信息和网络技术的飞速发展, 使得图像信息量激增,人们对检索图像信息的需求
也日益增加。作为一种纯面向对象的动态脚本语言 , python 已经在网络应用软
件、系统配置软件及科学研究领域获得了广泛的使用,因此本文介绍了一种基于
Python 的利用 Linux 平台下 Python 与 C++/C++语言的两种 Os.systeam 接口, 实现
了 python 与 VC 的混合语言编程,并将这种软件结构应用于一套图像采集器系
统。实际应用表明, 这种结构可以充分发挥 Python 编程的灵活简单和 VC 执行效
率高的优点, 克服 Python 执行效率低和 VC 开发效率低的缺点,实现了软件开发效
率和执行效率的双赢。
当今社会,科技发达成长了人们的懒惰性,利用各种机器设备做家务,利用远
程监控来遥控远在千里之外的东西,总之一切事务趋于自动化。图像采集器
(Image acquisition),是指通过摄像头采集图像信息,批量获取图像信息,能够根
据图像信息获取到物体运动的位移和执行的动作,这样采集到的图像信息分析
更加的准确,可靠性更强。本文设计了一种不用点击鼠标,不用按下键盘,只需
要轻轻的挥挥手就可以操纵 PPT 的翻页的软件--Airppt, 解决了以往操作 PPT 的
繁琐性,满足了人们对方便快捷生活的向往,并且提升了宣讲效率。有了
airppt,老师上课讲课就不用总在电脑旁用鼠标控制 ppt,这样就加大了老师与
学生的互动性。
Airppt 利用的原理就是图像采集器,它在国内外应用广泛,并且发展迅速,在
国外它应用于军事,医疗,监控等领域。在国内还没有太多的应用,据目前了
解到的在国内一般应用于监控的比较多,还有运用于娱乐的,通过采集器将用
户的身形采集到屏幕中并且可以采集到你的动作与里面的事物发生互动。
本 文 通 过 对 模 块 应 用 环 境 及 功 能 的 认 证 , 确 定 了 应 用 opencv 模 块 处 理 图
像,huigui 模块来识别并调用摄像头采集信息,image 模块处理采集到的图像大
小等,os 模块引入外部 C 扩展,在利用 python 代码将这些功能连接起来,最终
实现了 airppt 的相关协议所设定的功能。
本文主要研究内容如下:
(一)opencv 模块的安装调用及作用;
(二)Image 模块的用法安装;
(三)Huigui 模块的用法及调用;
(四)Python 外部 C 扩展的引入;
本设计采用 python 程序编写,硬件只需一个外置摄像头作为采集信息的工具。
2 Python 语言介绍
2.1Python 语言简介
Python 是一种解释型、交互式、纯面向对象的脚本程序设计语言,它结合了多种
不同语言最经典的设计原则和思想。自 1990 年 Guido van Rossum 发明 Python
以来,它的简单、清晰和优雅吸引了广泛的关注,Python 社区以每两年翻番的速度
迅速扩张。例如:Python 自 google 创建之初就是其主要网络应用开发工具;美国
国家航空航天局使用 Python 开发 CAD/CAE/PDM 资源库, 在此基础上建设新一代
协作式工程环境 NGCEE(Next Generation Collaborative Engineering Environment);
美国国家研究推进机构 CNRI(Corporation for National Research Initiatives )1999 年
启动的 Computer Programming for Everybody(C4PE)计划将 Python 作为未来程序
设计语言向教育机构推广; Microsoft 于 2005 年推出 Iron Python 的开源项目, 在
Visual Studio 2005 中接纳 Python 语言作为唯一动态脚本语言开发.net 应用程
序。
2.2Python 语言特性
相比其他任何程序设计语言, Python 允许软件设计者更关注于问题本身而不是实
现细节, 其主要特性有:
(l) 面向对象 Python 是一种纯面向对象语言, 支持面向对象的所有机制, 这使它
可以应用于大型软件项目开发。
(2) 虚拟机机制 Python 代码编译为字节码在虚拟机上执行,这种类似 Java 的机
制使 Python 具有平台无关性, 并获得比其他脚本语言更快的执行效率。
(3) 内置高级数据类型 Python 中的元组、列表、数组、字典等高级数据类型具
有极强的表达能力, 几乎任意复杂的对象在 Python 中均可以以最简单的方式进
行描述。
(4) 交互式开发方式和单元测试 类似 Foxpro 和 Matlab ,Python 提供了内置交互
式窗口, 可以允许开发者边尝试边书写代码, 极大地提高了软件开发效率。另外
单元测试机制在每个类代码完成后均可以单独执行、测试。这两种开发方式使
得”搭积木” 式的软件开发过程成为现实。
(5) 动态执行特性 类似早期 Dbase 系统的宏代替、Python 允许动态构造程序代
码并执行, 使得软件中的重复代码得到简化。
(6) 高度可扩展性 Python 语言本身只实现了一个小内核,其强大功能体现在大量
的扩展模块。计算机科学领域几乎所有的已知算法均可找到 Python 语言扩展。
不仅 c / c + + 编写的程序可以方便地改写成 Python 扩展模块,而且 Python 自身也
可以被嵌人到口 C/C++项目中。
(7) 平台无关性 Python 字节码可以不经修改跨平台运行在所有主流操作系统上,
甚至包括 Pocket PC 、Palm 等嵌入式系统。
3 设计思路和编程
3.1 设计思路
本文的设计思路是:
(1).编辑器的选择:python 固定的编辑器是 vim 编辑器,这个编辑器很容易
实现脚本的创建保存和运行,能大大提高程序员的编程速度,它还有一个非常
强大的功能,在电脑发生意外突然关机的情况下,这个编辑器就会自动保存你
之前你没有保存的程序。这样就不会丢失有用的信息
(2).图像坐标的产生:设计中采用的是判断红点的个数,红点指定义的一个
红色 RGB 色调,当我们动作时就会采集到红点动作的个数,通过判断红点的个
数,来判断鼠标是否要动作,通过动作的位移来判断鼠标动作的方向。
(3).图像的处理:图像的处理是用 Image 模块处理的,可改变图像的大小,
像素等,这样就可以把采集到的图像信息处理成所需要的。
(4).摄像头接口的处理:这里用的是 Opencv 模块来实现图像的坐标的采
集,opencv 的设计意图是为用户提供简单易用的图形用户接口。
(5).动作的反馈:当你用手在摄像头前挥动时,该动作就会被程序所识别,
然后发出相应的相应。
(6).功能的设定:这些功能是由 C 语言写的,然后引入 os 模块,通过 os 模块
将写好的 C 功能引入到脚本语言中去。然后再用判断语句,当程序符合哪种条
件是就会执行哪些 C 功能。
2 软件编程思想
本文的软件编程思想是:摄像头要采集手指运动的图像,来判断执行什么样的
动作,那么摄像头怎么样才能识别你的手指呢?本文在这里是用颜色( R,G,B)
来解决的,本设计把手指用(R,G,B)定义成红点,现在红点就代表手指,
应用指令控制摄像头来采集红点。这是本设计的第一步打算。
第二步,需要采集的目标已经确定,接下来就是判断红点的运动方向和位移,
我这里是通过判断红点运动的方向来确定对 airppt 执行什么样的动作;通过红
点的位移和个数来确定 airppt 是否要执行该动作,本设计在这里定义的是位移
大于 70mm,红点个数大于 20 个时 airppt 才会执行相应的动作。因为动画都是
由一张张图片组成的,假如不判断位移,当你不动作时它也会自动采集红点,
进而发生动作反应,这样就出错了。这里的中心思想就是 if 判断语句,事件处
理系统和 for 循环语句。
3.2 设计流程图
本文定义的参照物是一个用代码编写的 RGB 红点。并且分析每张图片的红点
数,当红点数达到 70 个时将该图片列为有效图片,否则无效。
图 3-1 设计全局架构结构图
图 3-1 是本设计的全局架构结构图,是本设计得以实现的最重要部分,对获取
到的图片分析是否有效,接下来则是细节部分,分析两张最近的有效图片中心
点位置来判断左翻页还是右翻页还是不翻页。
图 3-2 有效图片筛选架构图
图 3-2 实现的是对有效图片进行分析,通过判断最近两张有效图片的中心位置
点的位置关系来决定 ppt 是否执行动作,执行动作时是左翻页还是右翻页等一
系列功能。完成这一步所需的程序如下:
if len(list2)>20: #如果列表中坐标个数大于 20 个
if len(list2) > 20:
tn3=list2[-1][0]-list2[0][0] #将横坐标的长度赋值给 tn3
tn4=list2[-1][1]-list2[0][1] #将纵坐标的长度赋值给 tn4
while len(list2)>3: #
list2.pop(0)
#print '..........................',tn3
#print tn4
if tn4>50 and tn3>-50 and tn3<50:
os.system('./a.x 71')
if tn4<-50 and tn3>-50 and tn3<50:
os.system('./a.x 9')
if tn3<-100:
os.system('./a.x 114')
#print '[right]'
#time.sleep(0.8)
if tn3>100:
os.system('./a.x 113')
#print '[left]'
#time.sleep(0.8)
每次判断完一张图片后,就把列表中的红点数目与坐标等都删
除。这样就不会对下一张图片造成影响。
3.3 编程
在开始编程之前要先确定编程工具,本设计用的是 vim 编辑器。这个编辑器的
最大优势就是,在意外情况下可以自动保存代码。当代码错误时,会提示错误
信息,能够及时进行修改。以下是本设计的部分代码:
#!/usr/bin/python
这是解释 python 语言在电脑中的位置
#-*- coding: UTF-8 -*-
这是 python 脚本中的中文解释器
3.3.1  opencv 模块
    import opencv
    从外部引入 opencv 模块
    本设计用到的 opencv 代码如下:
    cam=highgui.cvCreateCameraCapture(0) #定义摄像头端口位置
    tn1=opencv.adaptors.Ipl2PIL(im) #采集到的图像定义为 tn1
OpenCV 的 全 称 是 Open Source Computer Vision Library , 是 一 个 跨 平 台 的
库。OpenCV 是由发起并参与开发,以授权发行,可以在商业和研究领域中免费
使用。OpenCV 可用于开发对实时的、以及程序。OpenCV 用语言编写,它的主
要接口也是 C++语言,但是依然保留了大量的接口。该库也有大量的,and/的接
口。这些语言的 API 接口函数可以通过在线文档获得。现在也提供对于,,的支
持。
安装 Opencv 所需的依赖工具:
cmake, gtk+*, ffmpeg*, gstreamer*
编译安装:
$ cd $DIR
$ mkdir release
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D
BUILD_PYTHON_SUPPORT=ON ..
$ make -j
$ make install
3.3.2  highgui 模块
    from opencv import highgui
    从 opencv 图形处理模块中引入 highgui 模块。HighHGUI 只是用来建立快速
软件原形或是试验用的。它的设计意图是为用户提供简单易用的图形用户接
口。
    本设计用到的 highgui 模块如下:
    im=highgui.cvQueryFrame(cam);这里 highgui 用来采集图像
    OpenCV 为了用于生产级别的应用而设计的。HighHGUI 只是用来建立快速
软件原形或是试验用的。它的设计意图是为用户提供简单易用的图形用户接
口。通常,你需要读入源图像到你的程序或者输出结果图像到磁盘。此外,需
要用简单的方法显示图像到监视器并且向用户提供输入.如果你试图创建最终用
户的应用,请不要使用 HighGUI 。 相对来说,应当为你的目标系统参考特定的
函数库。比如:HighGUI 中的摄像头输入方法(cvCreateCameraCapture)是为了
易用而设计的。然而,并不意味着它能够对热插拔作出反应等等。
3.3.3  image 模块
    import Image
    引入图像模块,对采集到的图像进行处理
    本设计用到的 image 模块代码:
    tn1=tn1.resize((160,160)) #重新设置采集到的图像的大小
    size1=tn1.size #将重新设置的图像的大小值定义位 size1
    pbb=tn1.load() #载入图像
    PythonWare 公司提供了免费的图像处理工具包 PIL(Python Image Library),该
软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式
转换,色场空间转换,图像增强,直方图处理,插值和滤波等 等。虽然在这个
软件包上要实现类似 MATLAB 中的复杂的图像处理 算法 并不 太适合, 但是
Python 的快速开发能力以及面向对象等等诸多特点使得它非常适 合用来进行原
型开发。在 PIL 中,任何一副图像都是用一个 Image 对象表示,而这个类由和它
同名的模块导出,因此,要加载一副图像,最简单的形式是这样的: import
Image
img = Image.open(“dip.jpg”)
    注意:第一行的 Image 是模块名;第二行的 img 是一个 Image 对象; Image
类是在 Image 模块中定义的。关于 Image 模块和 Image 类,切记不要混淆了。
现在,我们就可以对 img 进行各种操作了,所有对 img 的 操作最终都会反映到
到 dip.img 图像上。这个模块提供了一个常用的图像增强工具箱。可以用来进行
色彩增强、图像叠加、改变图像大小、亮度增强、对比度增强、图像尖锐化等
等增强操作。所有操作都有相同形式的接口——通过相 应类的 enhance 方法实
现:色彩增强通过 Color 类的 enhance 方法实现;亮度增强通过 Brightness 类的
enhance 方法实现;对比度增强通过 Contrast 类的 enhance 方法实现;尖锐化通
过 Sharpness 类的 enhance 方法实现。所有的操作都需要向类的构造函数传递
一个 Image 对象作为参数,这个参数定义了增强作用的对象。同时所有的操作
都返回一个新的 Image 对象。如果传给 enhance 方法的参数是 1.0, 则不对原图
像做任何改变,直接返回原图像的一个拷贝。
3.34  os 模块
    import os
    引入 os 模块,os 模块提供了一个统一的操作系统接口函数
    本设计引用 os 模块所实现的代码如下:
os.system('./fake-mouse-move.x 0 ' + str(m) + ' ' + str(n))#引入用 C 语言编写的程序
Python C 扩展
一个 C 源程序中的算法开发测试完毕后,可以改写为 python C 扩展暴露给 Python
程序使用。例如将 C 源程序中的 foo 函数转换为 python 语言的扩展, 需要以下步
骤:
(l) 包含 python.h 的头文件, 连接 pythonXX.lib(XX 是 python 版本号),其中 Python.h
定义了所有 Python 的内部数据结构和 C 的 API 函数原型。
(2) 定义一个此扩展模块的异常对象。
(3) 实现一个客户端函数, 这个函数负责将传入的 python 对象参数转换为 C 对象
并用这些参数调用 foo 函数, 最后将结果转换为 python 对象返回,如果出现错误,
则设置异常对象并返回 Null。这个客户端函数充当 python 和 C 程序之间的参数
调度者。
(4 ) 填写一个扩展模块定义的所有函数名与客户端函数对应关系表, 实现 python
程序和 C 程序的映射。
(5) 完成扩展模块的初始化函数。
3.4  C 语言与 Python 语言混合编程的接口问题
整个软件编程主要是用 Python 语言, C 语言只占了一小部分,因此设计中,将用 C
语言编的求解器做成一个扩展模块,嵌入到 Python 语言中。下面给出了在本软件
中的接口设计方法。
第一步,将用 C 语言编写的代码在 C 编译器中编译调试成功;
第二步, 在 C 代码中加入# include “Python. c”这条语句, 告诉 C 编译器将要调用
Python 库函数。
第三步, 在 C 代码中的主函数加上"PyObject * Module_func( )"Python 打包器,此打
包器的作用是把接受到的 Python 类型的值转换成 C 语言数据类型的值,并用这些
值做为实参,放到相关的函数中去计算, 计算完成后, 如果要将结果输出到 Python
编写处理器中, 必须由打包器接受计算结果并把它们转换成 Python 语言数据。
经过以上步骤即可完成 C 语言和 python 语言的混合编程。Python 中将这些步骤
封装成了一个方法,即 Os.system(),但是 python 中识别 C 代码需要这样的格
式:os.system(‘./...’)。
4 功能分析及预期效果
一、  功能分析
利用手指控制 ppt 实现的功能有:左翻页,右翻页,开启全屏,退出全屏
系统主要由 Python 开发,由于它自带的模块较多,所以要根据需求来调用其中
对 我 们 开 发 airppt 有 用 的 模 块 , 需 要 熟 悉 python 中 各 个 模 块 的 作 用 和 用
法。airppt 的原理是根据坐标和像素来采集图像信息,然后返回到程序中,通
过图像处理工具对采集到的图像进行处理,最后形成动作,来实现 airppt 的功
能。
本设计首先要用到图像处理工具是 Opencv , 从 opencv 图形处理模块中引入
highgui 模块。HighHGUI 只是用来建立快速软件原形或是试验用的。它的设计意
图是为用户提供简单易用的图形用户接口;引入图像模块 Image 对采集到的图
像进行处理,引入 os 模块提供一个统一的操作系统接口函数;引入时间模块来
获取本地时间。
其次要熟悉 python 的编程方法和获取坐标的原理,以及解决接口问题,这样就
需要多看 python 方面的资料,并且要选择编辑器来进行代码编写。代码编写要
求:掌握 python 的基本概念和基本的理论知识;熟练编程工具的使用方法;对
程序进行初步的编写和调试。
现在我只是初步实现了 airppt 的部分功能,接下来还要对它进行调试、整合,
扩充它的功能,直至其能实现手动控制 ppt。
二、 预期效果
通过测试,摄像头可以获取到手指的信息,光标并且会跟随手指的运动而动
作,目前还没有实现虚拟点击的效果,而且这个版本的光标动作不太稳定,会
在光标附近晃动,所以本设计开发了第二个版本,第二个版本不能显示光标动
作的痕迹,但是能控制 ppt 动作,识别效果不太明显,经分析这与摄像头像素
有关。不过还好,本设计的预期功能基本都实现了。以后还会增加在新功能,
优化已有的功能。下面是程序运行截图,图 4-1 是执行代码后的截图,图 4-2 是
操作 ppt 翻页的程序运行截图。

图 4-1 程序运行截图

图 4-2 程序执行操作截图

5    结论
在此次毕设中,我学到了很多东西,并且让我疯狂的喜欢上了编程,这段时间
感觉的过的特别充实,这几个月比大学四年学的东西都多,当然也有一些值得
改进以借鉴的地方,现总结如下:
1、需求设计:在前期查阅了相关的资料,对 python 的原理有一定的了解之
后,就开始着手对设计进行需求分析。并且试着画需求的流程图,可是经几番
修改再修改,还是没能如愿,这说明自己在这方面还有很多需要提高的地方。
于是就画出了双面板,但是我没有充分的考虑到这些功能的实际情况,使得做
出的需求很不好实现,但是最后还是做出了切合实际的需求分析流程,在老师
的教导下学会了制作需求分析流程的方法。
2、环境配置:在做出了需求分析后,将相应的软件下载之后,有的软件却怎么
也装不上,也不能引入到程序中。用 print 来分行检查代码,我发现有的安装包
需要依赖关系,或者是有的需要源码安装,非常费事,最后还是有一两个包装
不上,终于在老师的帮助下所有包都装上了,原来需要外源才可以安装。我想
到了可能是这个原因,但是不知道怎么去配置外源,这也让我认识到要运用合
理有效的方法去迎难而上,而不是想当然,问题很有可能就是出在这上面。
3、代码编写:查阅了大量的资料,有了这方面的思路后就开始编写代码了,获
取摄像头设置,接收采集信息的设置,但是意外的情况的判断都让我觉得有些
难以实现,特别是判断参照物是否动作了,是向那个方向动作的等,获取与处
理的联调实现起来确实不难么容易,还需要对编程思路进一步的认识。
   

参考文献
[1] ()().[M]..2008.
[2]. Python 标准库[M].. 2012.
[3].[M].. 2011.
[4].[M] 出版社. 2011.
[5]著 .Python 基础教程(第 2 版)[M].. 2010.
[6]. Python 学习手册(第 3 版)[M].. 2011.
[9]  李艳红,李海华.传感器原理及其应用[M].北京:北京理工大学出版社,2010.
[10]  谭浩强.C 程序设计北京[M].北京:清华大学出版社,1999.
[11]  C 语言入门经典(第 4 版)[M].北京:清华大学出版社,2008.
[12]  张若愚[M]:清华大学出版社,2012.
[13]  Python 编程入门经典 [M]:清华大学出版社,2011.
[14]  巴里深入浅出 Python[M].北京:东南大学出版社,2011.
[15]  Y.Daniel Liang[M]:机械工业出版社,2013.
[16]  Guido van Rossum Python Tutorial[J]:Python Software Foundation,2006.

致 谢
这次在实验室的经历是我在大学最后一次了,想想从大一开始,有过多少次的
实验课上看着同学都快走完了,自己还没什么头绪的焦头烂额,现在想起来竟
是那么的可笑,却又带着几分回忆和伤感。
我很珍惜这次做毕设的机会,不仅仅是我要交出大学阶段的学习成果,更是对
自己能力与知识的检测。在此,衷心地感谢我的指导教师。在我做毕业设计阶
段,他自始至终给予了我精心的指导和严格的要求,为本论文的顺利完成倾注
了大量的心血。老师为人谦逊,热心帮助学生,在我们做毕设遇到问题的时候
总能够不厌其烦的耐心予以指导,在此我要衷心的对老师说声谢谢。在她的热
心指导下,我学到的不仅仅是知识,还有做人上的严谨、独立,用科学的头脑
武装自己。
回首大学四年的时光,我要感谢那些帮助过我的人,也要感谢那些伤害过我的
人,是他们让我对自我有了更为清醒的认识,不再沉醉于自我满足之中,这又
何尝不是这一种收获呢。其实,最应该感谢的还是自己,因为路是自己走出来
的,有美景,也有荆棘,但重要的是,我会以更加稳健的步伐,朝着未来勇敢
的走下去。
反思这一阶段,体会最深的一点就是,编程就是要有清晰的思路,这样编起来
才有目的性,思维的不灵活导致有很多本该轻松理解的东西走了弯路,这并不
是我理想中的状态。硬件也好,软件也罢,都需要系统的理论知识的支撑。徒
有皮毛而不深入是不行的,只有有科学理性的方法去对待,遇到问题能镇定的
去沿着正确的轨道去思考进而解决问题是在今后的学习和工作中要时常提醒自
己的,这也是毕设给我带来的最大收获。感谢我敬爱的老师给我这次机会。
附 录
从毕设中得到了一些课外新知识,虚拟机不能用真机自带的摄像头。这也是我
毕设中遇到的最棘手的问题,我最后的解决方法是给虚拟机安装 USB 然后外置
一个摄像头,这样才把问题解决了。我认为这是一个很有价值的知识点,所有
我把它记录在这里。
以下是本设计的完整代码:
import time
list2=[] #定义一个空列表
cam=highgui.cvCreateCameraCapture(2) #定义摄像头端口位置
while True:
im=highgui.cvQueryFrame(cam)
tn1=opencv.adaptors.Ipl2PIL(im) #采集到的图像定义位 tn1
tn1=tn1.resize((160,160)) #重新设置采集到的图像的大小
size1=tn1.size #将重新设置的图像的大小值定义位 size1
pbb=tn1.load() #加载重新设置大小后的图像 tn1
c=0
d=0 #定义位置初值 c:横坐标,d:纵坐标
e=0 ; #定义红点的初始值为 0
for i in range(size1[0]):
for j in range(size1[1]): #遍历图像中的每个像素点
if pbb[i,j][0]>100 and pbb[i,j][0]>2*pbb[i,j][1] and pbb[i,j][0]>2*pbb[i,j][2]: #定义动
作的参照物,这里我将它定义为'红点'
c+=i
d+=j #如果该像素点符合我们所定义的红点的特征,则将此位置加到
横纵坐标上?
e+=1 #同时像素点数加 1(可求出我们采集到的这张图片中所有的红
点数)
#print '-----------------------------------------',e#如果红点数大于 70 个
if e>70: #如果红点数大于 70 个
list2.append((c/e,d/e)) #将横纵坐标的平均值加入先前定义的空列表中?
m=(160-list2[-1][0])*1280/140-100 #鼠标移动
n=list2[-1][1]*1024/140-100 #
# print m,n
os.system('./fake-mouse-move.x 0 ' + str(m) + ' ' + str(n))#引入用 C 语言编写的程序
# if len(list2)>20: #如果列表中坐标个数大于 20 个
if len(list2) > 20:
tn3=list2[-1][0]-list2[0][0] #将横坐标的长度赋值给 tn3
tn4=list2[-1][1]-list2[0][1] #将纵坐标的长度赋值给 tn4
while len(list2)>3: #
list2.pop(0)
#print '..........................',tn3
#print tn4
if tn4>50 and tn3>-50 and tn3<50:
os.system('./a.x 71')
if tn4<-50 and tn3>-50 and tn3<50:
os.system('./a.x 9')
if tn3<-100:
os.system('./a.x 114')
#print '[right]'
#time.sleep(0.8)
if tn3>100:
os.system('./a.x 113')
#print '[left]'
#time.sleep(0.8)
elif len(list2)>1:
tn3=list2[-1][0]-list2[0][0]
tn4=list2[-1][1]-list2[0][1]
list2=[]
#print '...........................',tn3
#print tn4
if tn4>50 and tn3<50 and tn3>-50:
os.system('./a.x 71')
if tn4<-50 and tn3<50 and tn3>-50:
os.system('./a.x 9')
if tn3<-100:
os.system('./a.x 114')
#print '[right]'
#time.sleep(0.8)
if tn3>100:
os.system('./a.x 113')
#print '[left]'
#time.sleep(0.8)
del tn1
del pbb
del im
del c
del e
del d

You might also like