上文讲到的是保证硬件的接通。接下来是用C语言在它提供的API接口进行连接。

  在网盘中下载MindSet Development Tools这个开发包。这个目录下MindSet Development Tools\ThinkGear Communications Driver\win32有一些文件是要用到的。

  我采用的MinGW这个库。这个库的好处是绿色版,一般情况下在没有开发环境的电脑,都可以运行。(我们都知道一个VS安装要一个多小时)。MinGW各个开发库基本没有版本要求。好了我们先在MinGW这个目录下创建一个ThinkGear目录,这个目录跟bin目录是同级的。然后进入ThinkGear目录复制上面提到的win32目录下的thinkgear_testapp.c thinkgear.h和thinkgear.dll,然后还要复制thinkgear.dll文件到MinGW\bin目录用作动态库。现在文件就都准备好了,现在我们先写一个Makefile。

 LDFLAGS= -L ..\bin
LIBS= -lthinkgear
main:thinkgear.h thinkgear_testapp.c
gcc $(LDFLAGS) $(LIBS) thinkgear_testapp.c -o main.exe

  然后命令行执行make , main.exe执行程序

  现在目录下的文件有

  \ThinkGear

main.exe  makefile thinkgear.dll  thinkgear.h  thinkgear_testapp.c

  下面将对源代码进行部分注解

 #include <stdlib.h>
#include <stdio.h> #include "thinkgear.h" void wait()
{
printf( "\n" );
printf( "Press the ENTER key...\n" );
fflush( stdout );
getc( stdin );
} /**
* Program which prints ThinkGear EEG_POWERS values to stdout.
*/
int main( void ) { char *comPortName = NULL;
int dllVersion = ; //动态库版本
int connectionId = ;//连接ID
int packetsRead = ; //包数量
int errCode = ; //错误码 /* Print driver version number */
dllVersion = TG_GetDriverVersion();
printf( "ThinkGear DLL version: %d\n", dllVersion ); //打印当前动态库版本 /* Get a connection ID handle to ThinkGear */
connectionId = TG_GetNewConnectionId(); //获取连接ID 跟文件描述符类似的功能
if( connectionId < ) {
fprintf( stderr, "ERROR: TG_GetNewConnectionId() returned %d.\n",
connectionId );
wait();
exit( EXIT_FAILURE );
} /* Set/open stream (raw bytes) log file for connection */
// 原始数据日志 用于高级分析
errCode = TG_SetStreamLog( connectionId, "streamLog.txt" );
if( errCode < ) {
fprintf( stderr, "ERROR: TG_SetStreamLog() returned %d.\n", errCode );
wait();
exit( EXIT_FAILURE );
} /* Set/open data (ThinkGear values) log file for connection */
//ThinkGear数据日志 一种动态库已经封装好的数据
errCode = TG_SetDataLog( connectionId, "dataLog.txt" );
if( errCode < ) {
fprintf( stderr, "ERROR: TG_SetDataLog() returned %d.\n", errCode );
wait();
exit( EXIT_FAILURE );
} /* Attempt to connect the connection ID handle to serial port "COM5" */
comPortName = "\\\\.\\COM3"; //这个是要连接的COM端口 这个在那个计算机管理工具里面看 里面的COM端口多少这里就多少
errCode = TG_Connect( connectionId,
comPortName,
TG_BAUD_9600,
TG_STREAM_PACKETS );
if( errCode < ) {
fprintf( stderr, "ERROR: TG_Connect() returned %d.\n", errCode );
wait();
exit( EXIT_FAILURE );
} if( ==TG_EnableBlinkDetection(connectionId,)) //启动眨眼检测
{
printf("Success enable blink\n");
} /* 不停的读取数据 */
packetsRead = ;
while()
{
/* 读一个报文 */
errCode = TG_ReadPackets( connectionId, );
/* 如果这个报文读取成功 */
if( errCode == )
{
int att, det, sig;
if(( errCode = TG_GetValueStatus(connectionId, TG_DATA_ATTENTION)) != )
{
att = TG_GetValue(connectionId, TG_DATA_ATTENTION) ;
det = TG_GetValue(connectionId, TG_DATA_MEDITATION);
sig = TG_GetValue(connectionId, TG_DATA_POOR_SIGNAL);
printf("attentin = %d, meditation=%d, signal=%d\n", att, det, sig);
}
}
else
{
printf("ReadPackets:errcode=%d\n", errCode);
}
}
//关闭连接
TG_FreeConnection( connectionId );
wait();
return( EXIT_SUCCESS );
}

先编译连接,运行一下这个程序,至此软硬件的环境都弄好了。剩下的就是算法设计了。

========================我是分割线=========================

  接下来的一段时间我都会更新关于这个基于脑电波疲劳检测的博客,在看博客的你,如果有更好的检测算法,可以在评论下给出一些想法。并能给出一定的实现思路。我现在的想法是在它提供的那几个波段(上面提到的)中对强度进行判断。然后还有一个就是统计几个波段,然后计算对应的方差。还有就是通过里面有一个判断眨眼的函数来判断眨眼。我们可以根据眨眼的时间差来判断。不过不同的人眨眼的时间是不同的。所以还有让系统先预处理一下,保存当前这个人的眨眼时间差。现在我就想到了这些。具体怎么做还有一段时间。

===========================================================

参考资料:

http://www.neurosky.com.cn/news_ny.aspx?NewsID=58

基于mindwave脑电波进行疲劳检测算法的设计(2)的更多相关文章

  1. 基于mindwave脑电波进行疲劳检测算法的设计(5)

    时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...

  2. 基于mindwave脑电波进行疲劳检测算法的设计(1)

    一.简介 脑波,又称之为脑电波,是人大脑发出的电波,非常的微弱,只能通过设备来检测.人的脑波在不同状态下,会不同,因此可以通过脑波来量化分析人的精神状态. 科学家讲脑电波分为四种,以下为详细解释 (1 ...

  3. 基于mindwave脑电波进行疲劳检测算法的设计(4)

    上一次的实验做到可以从pc端读取到MindWave传输过来的脑电波原始数据了. 我是先定义一个结构体,该结构体对应保存所有能从硬件中取到的原始数据. struct FD_DATA { int batt ...

  4. 基于mindwave脑电波进行疲劳检测算法的设计(3)

    这一节我将讲解thinkgear.h 里面的函数和宏定义.这一些都可以在MindSet Development Tools\ThinkGear Communications Driver\docs\h ...

  5. 基于深度学习的目标检测算法:SSD——常见的目标检测算法

    from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...

  6. 基于Shading Model(对光照变化一定不变性)的运动目标检测算法

    光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...

  7. 基于候选区域的深度学习目标检测算法R-CNN,Fast R-CNN,Faster R-CNN

    参考文献 [1]Rich feature hierarchies for accurate object detection and semantic segmentation [2]Fast R-C ...

  8. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法

    光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...

  9. 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)

    SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...

随机推荐

  1. union的含义

    用于合并两个或者多个select语句的结果集 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. ex ...

  2. CentOS root用户修改密码

    1.root用户修改密码: #passwd -------------------------------- 参考资料: 1.Centos修改root密码:http://blog.163.com/wz ...

  3. 在Visual Studio代码中使用Flask

    Flask是一个用于Web应用程序的轻量级Python框架,它提供了URL路由和页面呈现的基础知识. Flask被称为“微”框架,因为它不直接提供表单验证,数据库抽象,身份验证等功能.这些功能由称为F ...

  4. Couple number

    P1348 Couple number 我其实找规律了的,然后也没仔细分析,这个题多巧妙. C=a^2-b^2=(a+b)(a-b) 对于任意a而言,加减同一个数得到的数的奇偶性相同,故c=奇数或4的 ...

  5. codeforces-1114F-线段树练习

    https://www.cnblogs.com/31415926535x/p/10391639.html 概述 这是一道用线段树维区间值的一道题,,题意很简单,,就是对于给定的一个序列,,初始时每个数 ...

  6. Orleans高级功能

    一.Reentrant Grains二.请求上下文三.激活垃圾收集四.外部任务和Grains五.序列化六.代码生成七.在Silo内的应用程序引导八.拦截器九.取消令牌十.Powershell客户端十一 ...

  7. OpenStack-Zun 使用

    Zun组件简介 Zun是Openstack中提供容器管理服务的组件,于2016年6月建立.Zun的目标是提供统一的Openstack API用于启动和管理容器,支持多种容器技术.Zun原来称为Higg ...

  8. Shiro笔记(三)授权

    Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...

  9. 潭州课堂25班:Ph201805201 爬虫基础 第十一课 点触验证码 (课堂笔记)

    打开 网易盾 http://dun.163.com/trial/picture-click  ——在线体验——图中点选 打码平台 ——超级鹰    http://www.chaojiying.com/ ...

  10. scrollview滑动到某区域执行某种方法

    在这里通过  offset.y   检测滑动到的区域 通过if 语句执行需要的方法   -(void)scrollViewDidScroll:(UIScrollView *)scrollView { ...