一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于视觉识别技术的窗帘升降系统的制作方法

2021-11-29 13:41:00 来源:中国专利 TAG:


1.本实用新型涉及智能家居技术领域,特别涉及一种基于视觉识别技术的窗帘升降系统。


背景技术:

2.窗帘是一种常见的家居用品,常用在门窗上,传统的窗帘通过手动方式进行收卷或者展开,随着智能家居技术的发展,电动窗帘应运而生,电动窗帘通过电机实现窗帘的动作,另外通过开关、遥控器等设备实现与用户的连接,实现了用户的窗帘动作的控制。此外,部分窗帘还连接有诸如单片机之类的自动控制设备,通过自编程序或者另设传感器的信号来控制窗帘动作,实现了窗帘的自动化控制。
3.但是现有技术中的窗帘,当需要用户主观控制窗帘的升降或者打开时,需要用户手动操作或者通过开关、遥控器等来操作,均需要用户对窗帘或者控制设备进行接触,称为“有接触控制”,在使用上存在限制,此外,现有技术中还有一种声控窗帘,通过声音来控制窗帘,但是对于聋哑人等不便发声的人群来说难以适用。


技术实现要素:

4.本实用新型提供了一种基于视觉识别技术的窗帘升降系统,其优点是通过识别用户的动作来控制窗帘的升降,用户需要控制窗帘升降时,只需完成特定的动作即可,而无需接触窗帘,也不需要开关、遥控器等控制设备。
5.本实用新型的上述目的是通过以下技术方案实现的,一种基于视觉识别技术的窗帘升降系统,其特征在于,包括图像采集装置、微机控制器和升降窗帘,图像采集装置用于采集人体图像,图像采集装置与微机控制器连接,所述升降窗帘包括窗帘支架,窗帘支架上设有卷轴,横轴上连接有帘布,卷轴连接有电机,电机与微机控制器连接并受微机控制器控制。
6.本实用新型进一步设置为,所述图像采集装置为体感摄像机。
7.本实用新型进一步设置为,体感摄像机采集人体图像信息并识别人体肢体位置,微机控制器读取人体头部和双手的位置信息,当手部的高度高于头部的高度时通过控制器控制电机工作,并且两只手高度分别高于头部高度时,电机的转动方向相反。
8.本实用新型进一步设置为,体感摄像机采集人体图像信息并识别人体肢体位置,计算机读取人体头部和任一一只手的位置信息,当手部高度高于头部高度时,通过控制器控制电机正转,当手部高度低于头部高度时,通过控制器控制电机反转。
9.本实用新型进一步设置为,所述微机控制器为arduino开源电子原型平台。
10.本实用新型进一步设置为,所述电机和卷轴之间设有齿轮减速器,减速器的输出轴与卷轴连接,电机主轴上设有蜗杆,减速器的输入端设有与蜗杆啮合的蜗轮。
11.综上所述,本实用新型的有益效果有:
12.1.通过体感摄像机采集用户的人体图像并识别出肢体位置,通过用户肢体的移动
来控制窗帘的升降,达到了无接触控制的目的,方便了使用,更方便对于发声不便的人的使用;
13.2.减速器与电机之间通过蜗轮蜗杆连接,蜗轮蜗杆存在自锁功能,窗帘移动到位后不易因自身重力滑落。
附图说明
14.图1是本实施例的整体结构框架图;
15.图2是本实施例中升降窗帘的示意图;
16.图3是本实施例中升降窗帘的正视图;
17.图4是本实施例中人体姿势简图;
18.图5是本实施例中人体姿势坐标点图;
19.图6是本实施例中的控制流程图。
20.图中,1、窗帘支架;2、卷轴;3、电机;4、帘布;10、体感摄像机。
具体实施方式
21.下面结合附图详细说明本实用新型的具体实施方式。
22.实施例:参考图1

6,一种基于视觉识别技术的窗帘升降系统,包括、微机控制器和升降窗帘,图像采集装置用于采集人体图像,图像采集装置与微机控制器连接,所述升降窗帘包括窗帘支架1,窗帘支架1上设有卷轴2,横轴上连接有帘布4,卷轴2连接有电机3,电机3与微机控制器连接并受微机控制器控制。电机3和卷轴2之间设有齿轮减速器,减速器的输出轴与卷轴2连接,电机3主轴上设有蜗杆,减速器的输入端设有与蜗杆啮合的蜗轮,减速器与电机3之间通过蜗轮蜗杆连接,蜗轮蜗杆存在自锁功能,窗帘移动到位后不易因自身重力滑落。
23.所述图像采集装置为体感摄像机10,具体的,选择微软公司推出的kinect v2型3d体感摄影机,它采集人体的图像信息并可以识别出人体的肢体。其进行姿势识别的方法是:(1)使用两个数据流的卷积神经网络来进行视频行为识别。他们将视频分成静态帧数据流和帧间动态数据流,静态帧数据流可使用单帧数据,帧间动态的数据流使用光流数据,每个数据里都使用深度卷积神经网络进行特征提取。最后将得到的特征使用svm进行动作的识别。他们提出只使用人体姿势的关节点部分的相关数据进行深度卷积网络进行特征提取,最后使用统计的方法将整个视频转换为一个特征向量,使用svm进行最终分类模型的训练和识别。(2)长时递归卷积神经网络(long

term recurrent convolutional network,lrcn),这个网络将cnn和lstm结合在一起对视频数据进行特征提取,单帧的图像信息通过cnn获取特征,然后将cnn的输出按时间顺序通过lstm,这样最终将视频数据在空间和时间维度上进行特征表征,在ucf101数据库上得到了82.92% 的平均识别率。(3)part

aware lstm的模型,该模型在lstm的基础上,允许有多个i、g和f门,但是只有一个o门,主要是将25个人体骨骼根据动作的相关性分成5个组:躯干、双手和双腿。让这个5个组分别通过自己的i、g和f门,但是却共享一个o门,即每一个时间序列上,这5个组各自的状态存在细胞状态中,这样不仅可以得到人体关节在时间序列上的关联,也可以通过分组更好获取人体运动的特征。
24.所述微机控制器为arduino开源电子原型平台,它构建于开放原始码simple i/o介面版,并且具有使用类似java、c语言的processing/wiring开发环境,对arduino的编程是通过 arduino编程语言 (基于 wiring)和arduino开发环境(基于 processing)来实现的,可与计算机上processing进行通信,因此arduino的程序可在processing编写号后录入至arduino中。
25.体感摄像机10采集人体图像信息并识别人体肢体位置,微机控制器读取人体头部和双手的位置信息,当手部的高度高于头部的高度时通过控制器控制电机3工作,并且两只手高度分别高于头部高度时,电机3的转动方向相反。上述步骤可具体通过processing软件编程实现,算法步骤流程如图6所示。如图4和5所示,以人体双臂和肩膀在一条线上的姿势称为t姿势,以t姿势作为判断基准点,微型控制器读取用于双手和头部的位置信息(x1,y1)、(x2,y2)和(x3,y3),当y1>y3时,控制电机3正转,当y2>y3时,控制电机3反转,实现了通过双手的动作来控制窗帘升降的目的。实现上述功能的一个参考程序如下:
26.import kinect4winsdk.kinect;//包含两个头文件
27.import kinect4winsdk.skeletondata;//包含两个头文件
28.import processing.serial.*; //包含串口头文件
29.serial myport; //定义串口
30.kinect kinect;//定义kinect
31.arraylist <skeletondata> bodies;//数组列表<骨架数据>主体;
32.int x1,x2,x3;//左手,右手,肩部中间
33.int y1,y2,y3;//左手,右手,肩部中间
34.int flag1 = 0;
35.int flag2 = 0;
36.void setup()//初始化函数
37.{
[0038] size(1280, 960);//创建一个窗口
[0039] background(0);//设置背景颜色为黑色
[0040] kinect = new kinect(this);//打开kinect
[0041] smooth();//平滑处理
[0042] bodies = new arraylist<skeletondata>();
[0043] //主题 = 新 数组列表<骨架数据>
[0044] myport = new serial(this, "com4", 9600);//这里要修改成和arduino区配的
[0045]
void control()//控制函数
[0046]
{
[0047] //左手高于头部
[0048] if((y1 < y3)&&(flag1 == 0))
[0049] {
[0050]
ꢀꢀꢀ
print("a");//正转
[0051]
ꢀꢀꢀ
myport.write('a');//发送正转
[0052]
ꢀꢀꢀ
flag1 = 1;
[0053] //左手低于头部
[0054] }else if((y1 >= y3)&&(flag1 == 1))
[0055] {
[0056]
ꢀꢀꢀ
print("c");//停止正转
[0057]
ꢀꢀꢀ
myport.write('c');//发送停止正转
[0058]
ꢀꢀꢀ
flag1 = 0;
[0059] }
[0060] //右手高于头部
[0061] if((y2 < y3)&&(flag2 == 0))
[0062] {
[0063]
ꢀꢀꢀ
print("b");//反转
[0064]
ꢀꢀꢀ
myport.write('b');//发送反转
[0065]
ꢀꢀꢀ
flag2 = 1;
[0066] //右手低于头部
[0067] }else if((y2 >= y3)&&(flag2 == 1))
[0068] {
[0069]
ꢀꢀꢀ
print("d");//停止反转
[0070]
ꢀꢀꢀ
myport.write('d');//发送停止反转
[0071]
ꢀꢀꢀ
flag2 = 0;
[0072]
ꢀꢀ
}
[0073]
}
[0074]
对背景进行定义,设置背景颜色,画骨架,填充颜色并追踪骨架位置。
[0075]
void draw()//主函数
[0076]
{
[0077]
ꢀꢀ
background(0);//设置背景颜色
[0078]
ꢀꢀ
image(kinect.getmask(), 0, 240, 320, 240);//打开图片到窗口人体骨骼
[0079]
ꢀꢀ
for (int i=0; i<bodies.size(); i )
[0080]
ꢀꢀ
{
[0081]
ꢀꢀꢀ
drawskeleton(bodies.get(i));//画骨架
[0082]
ꢀꢀ
// drawposition(bodies.get(i));//绘制骨骼位置
[0083]
ꢀꢀ
}
[0084]
ꢀꢀ
control();//控制函数
[0085]
}
[0086]
void drawposition(skeletondata _s) //绘制位置
[0087]
{
[0088]
ꢀꢀ
nostroke();//关闭画笔
[0089]
ꢀꢀ
fill(0, 100, 255);//定义形状颜色
[0090]
ꢀꢀ
string s1 = str(_s.dwtrackingid);
[0091]
ꢀꢀ
text(s1, _s.position.x*width/2, _s.position.y*height/2);
[0092]
ꢀꢀ
//写一个数字在骨骼上
[0093]
}
[0094]
void drawskeleton(skeletondata _s) //画骨架
[0095]
{
[0096]
ꢀꢀ
drawbone1(_s, kinect.nui_skeleton_position_wrist_left,
[0097]
ꢀꢀ
//骨骼位置手腕左
[0098]
ꢀꢀ
kinect.nui_skeleton_position_hand_left);
[0099]
ꢀꢀ
//骨骼位置手左
[0100]
ꢀꢀ
drawbone2(_s, kinect.nui_skeleton_position_wrist_right,
[0101]
ꢀꢀ
//骨骼位置手腕右
[0102]
ꢀꢀ
kinect.nui_skeleton_position_hand_right);
[0103]
ꢀꢀ
//骨骼位置手右
[0104]
ꢀꢀ
drawbone3(_s, kinect.nui_skeleton_position_head,
[0105]
ꢀꢀ
//骨架位置头
[0106]
ꢀꢀ
kinect.nui_skeleton_position_shoulder_center);
[0107]
ꢀꢀ
//骨架位置肩中央
[0108]
}
[0109]
void drawbone1(skeletondata _s, int _j1, int _j2) //画骨头
[0110]
{
[0111]
ꢀꢀ
nofill();//没有填充
[0112]
ꢀꢀ
stroke(255, 255, 0);//画笔颜色为黄色小人
[0113]
if (_s.skeletonpositiontrackingstate[_j1] !=
[0114]
kinect.nui_skeleton_position_not_tracked&&
[0115]
_s.skeletonpositiontrackingstate[_j2] != kinect.nui_skeleton_position_not_tracked)
[0116]
{
[0117]
ꢀꢀꢀ
line(_s.skeletonpositions[_j1].x*width,
[0118]
ꢀꢀꢀ
_s.skeletonpositions[_j1].y*height,
[0119]
ꢀꢀꢀ
_s.skeletonpositions[_j2].x*width,
[0120]
ꢀꢀꢀ
_s.skeletonpositions[_j2].y*height);//画直线
[0121]
ꢀꢀꢀ
y1 = int(_s.skeletonpositions[_j2].y*height);
[0122]
ꢀꢀ
}
[0123]
}
[0124]
void drawbone2(skeletondata _s, int _j1, int _j2) //画骨头
[0125]
{
[0126]
ꢀꢀ
nofill();//没有填充
[0127]
ꢀꢀ
stroke(255, 255, 0);//画笔颜色为黄色小人
[0128]
ꢀꢀ
if (_s.skeletonpositiontrackingstate[_j1] != kinect.nui_skeleton_
position_not_tracked &&
[0129]
ꢀꢀꢀ
_s.skeletonpositiontrackingstate[_j2] != kinect.nui_skeleton_position_not_tracked) {
[0130]
ꢀꢀꢀ
line(_s.skeletonpositions[_j1].x*width,
[0131]
ꢀꢀꢀ
_s.skeletonpositions[_j1].y*height,
[0132]
ꢀꢀꢀ
_s.skeletonpositions[_j2].x*width,
[0133]
ꢀꢀꢀ
_s.skeletonpositions[_j2].y*height);//画直线
[0134]
ꢀꢀꢀ
y2 = int(_s.skeletonpositions[_j2].y*height);
[0135]
ꢀꢀ
}
[0136]
}
[0137]
void drawbone3(skeletondata _s, int _j1, int _j2) //画骨头
[0138]
{
[0139]
ꢀꢀ
nofill();//没有填充
[0140]
ꢀꢀ
stroke(255, 255, 0);//画笔颜色为黄色小人
[0141]
ꢀꢀ
if (_s.skeletonpositiontrackingstate[_j1] != kinect.nui_skeleton_position_not_tracked &&
[0142]
ꢀꢀꢀ
_s.skeletonpositiontrackingstate[_j2] != kinect.nui_skeleton_position_not_tracked) {
[0143]
ꢀꢀꢀ
line(_s.skeletonpositions[_j1].x*width,
[0144]
ꢀꢀꢀ
_s.skeletonpositions[_j1].y*height,
[0145]
ꢀꢀꢀ
_s.skeletonpositions[_j2].x*width,
[0146]
ꢀꢀꢀ
_s.skeletonpositions[_j2].y*height);//画直线
[0147]
ꢀꢀꢀ
y3 = int(_s.skeletonpositions[_j1].y*height);
[0148]
ꢀꢀ
}
[0149]
}
[0150]
void appearevent(skeletondata _s) //出现事件
[0151]
{
[0152] if(_s.trackingstate == kinect.nui_skeleton_not_tracked)
[0153]
ꢀꢀꢀ
//如果跟踪状态等于骨架没有追踪
[0154]
ꢀꢀꢀ
return;//返回
[0155]
ꢀꢀ
}
[0156] synchronized(bodies) //同步主体数组
[0157]
ꢀꢀ
bodies.add(_s);
[0158]
ꢀꢀ
}
[0159]
}
[0160]
void disappearevent(skeletondata _s) //消失事件
[0161]
{
[0162]
ꢀꢀ
synchronized(bodies) {//同步主体数组
[0163]
ꢀꢀꢀ
for (int i=bodies.size ()

1; i>=0; i
‑‑
)
[0164]
ꢀꢀꢀ
{
[0165]
ꢀꢀꢀꢀ
if(_s.dwtrackingid == bodies.get(i).dwtrackingid)
[0166]
ꢀꢀꢀꢀ
{
[0167]
ꢀꢀꢀꢀꢀ
bodies.remove(i);
[0168]
ꢀꢀꢀꢀ
}
[0169]
ꢀꢀꢀ
}
[0170]
ꢀꢀ
}
[0171]
}
[0172]
void moveevent(skeletondata _b, skeletondata _a) //移动事件
[0173]
{
[0174]
ꢀꢀ
if(_a.trackingstate == kinect.nui_skeleton_not_tracked)
[0175]
ꢀꢀ
{
[0176]
ꢀꢀꢀ
return;
[0177]
ꢀꢀ
}
[0178]
ꢀꢀ
synchronized(bodies) {
[0179]
ꢀꢀꢀꢀ
for(int i=bodies.size ()

1; i>=0; i
‑‑
)
[0180]
ꢀꢀꢀꢀ
{
[0181]
ꢀꢀꢀꢀ
if(_b.dwtrackingid == bodies.get(i).dwtrackingid)
[0182]
ꢀꢀꢀꢀꢀ
{
[0183]
ꢀꢀꢀꢀꢀꢀ
bodies.get(i).copy(_a);
[0184]
ꢀꢀꢀꢀꢀꢀ
break;
[0185]
ꢀꢀꢀꢀꢀ
}
[0186]
ꢀꢀꢀꢀ
}
[0187]
ꢀꢀ
}
[0188]
}
[0189]
在其他一些实施例中,体感摄像机采集人体图像信息并识别人体肢体位置,计算机读取人体头部和双手的位置信息,当手部位置高于头部位置时,通过控制器控制电机正转,当手部高度低于头部高度时,通过控制器控制电机反转,同样上述步骤可具体通过processing软件编程实现。
[0190]
以上所述的仅是本实用新型的优选实施方式,应当指出,对于本领域的普通技术人员来说,在不脱离本实用新型创造构思的前提下,还可以做出若干变形和改进,这些都属于本实用新型的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献