欢迎来到工友文库! | 帮助中心 工友共享,造福你我!
工友文库
全部分类
  • 行业文库 >
    行业文库
    行业标准 农林牧渔 能源矿业 电力热力 水利环境 材料技术 地理测绘 建筑工程 机械工程 制造加工 交通物流 网络计算 电气机电 信息通讯 汽车行业 航空航天 船舶工程 光电工程 住宿餐饮 财会金融 房地产业 城建规划 装饰装修 家电维修 电商行业 租赁商务 批发零售 居民服务 教育服务 医药卫生 体育行业 公共管理 图书管理 外语翻译 休闲旅游 文艺传媒 其他行业
  • 商业文档 >
    商业文档
    企业计划 工程管理 广告经营 财务报表 物业管理 质控管理 企业文化 绩效管理 商务礼仪 创业孵化 市场营销 经营企划 销售管理 营销创新 资本运营 招商加盟 合同协议 信息管理 励志材料 人事档案 员工关系 薪酬管理 招聘面试 其它文档
  • 办公文书 >
    办公文书
    统计图表 总结报告 演讲致辞 心得体会 述职报告 工作计划 解决方案 调研报告 事务文书 经验事迹 往来文书 规章制度 申请范文 求职简历 活动策划 会议纪要 党建材料 软件教程 其他文书
  • PPT模板库 >
    PPT模板库
    扁平风格 创意新颖 动画效果 动态模板 简约风格 静态模板 环保绿色 卡通风格 立体风格 欧洲风格 手绘风格 创意黑板 相册风格 星空风格 炫酷科技 中国风格 医疗风格 高端商务 工作常用 总结报告 毕业答辩 节日庆典 公益风格 化妆美容 婚礼策划 餐饮美食 培训课件 融资路演 商业策划 英文模板 党政机关 述职竞聘
  • 小学初中 >
    小学初中
    幼儿教育 小学语文 小学数学 小学英语 初中语文 初中数学 初中英语 初中物理 初中化学 初中地理 初中生物 初中政治 初中历史 思想品德 小学竞赛 初中竞赛 其他学科
  • 高中教育 >
    高中教育
    高中语文 高中数学 高中英语 高中物理 高中化学 高中生物 高中地理 高中政治 高中历史 高考资料 高中竞赛 其他学科
  • 高等教育 >
    高等教育
    基础课 艺术类 哲学类 体育类 水利类 测绘类 法学类 历史学 社会学 心理学 教育学 政治学 统计学 房地产 语言文化 生物科学 医药卫生 天文气象 地理科学 环境科学 系统科学 材料科学 机械仪表 图书档案 土建工程 海洋工程 轻工纺织 工程力学 能源动力 光电工程 电力技术 市政工程 财会金融 工商管理 语言文学 广播影视 公安司法 汽车汽修 交通运输 水产加工 植物生产 森林资源 动物科学 食品加工 餐饮旅游 公共事业 新闻传播学 农林业工程 城镇规划管理 水文与水资源 地矿及资源勘查 航空航天与武器 管理科学与工程 农林业经济管理 机电设备及自动化 计算机与信息科学 大学生竞赛资料
  • 执业资格考试 >
    执业资格考试
    财会类考试 建筑类考试 外贸类考试 外语类考试 医药类考试 管理类考试 公务员类考试 司法法律考试 教师资格考试 计算机类考试 公共服务类考试 其他资格证考试
  • 一线采风 >
    一线采风
    一线新闻 事迹宣传 工友作品
  • 教育视频 >
    教育视频
    幼儿教育视频 小学教育视频 初中教育视频 高中教育视频 大学教育视频 C#自学视频教程 软件视频教程 英语视频教学 其他教学视频
  • 换一换
    首页 工友文库 > 资源分类 > DOCX文档下载
     

    基于“手势识别”的人机交互系统设计.docx

    • 资源ID:3391       资源大小:2.82MB        全文页数:26页
    • 资源格式: DOCX        下载权限:注册会员/VIP会员    下载费用:2金币 【人民币2元】
    下载资源需要2金币 【人民币2元】
    已注册用户请登录:
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

    基于“手势识别”的人机交互系统设计.docx

    第十二届智能控制设计大赛 华南理工大学第十二届智能控制设计大赛 初级组 基于“手势识别”的人机交互系统 自动化科学与工程学院 队名 队长 时间 目录 初级组基于”手势识别”的人机交互系统1 摘要3 一、题目分析4 A.设计要求4 B.题目分析4 二、已实现功能5 A.基本要求5 B. 拓展要求5 三、方案设计与选择5 A. 手势分割方案5 (1)方案1基于HSV色彩空间的肤色识别5 (2)方案2基于YCrCb色彩空间的肤色检测6 (3)方案分析比较与选择7 B. 手势识别方案8 (1)方案1重心距离法8 (2)方案2凸包检测法8 (3)方案分析比较与选择9 四、方案实施9 A.手势分割9 B.重心距离法实现锤子剪刀布的游戏10 C.凸包检测法15 D.鼠标控制18 E.人脸识别20 五、调试及成品展示22 A.MFC人机交互界面22 B.锤子剪刀布识别展示22 C. 数字识别展示23 D. 人脸检测展示24 F.空间中写字展示25 六、总结25 七、参考文献26 摘要 手势也是表达信息的一种重要方式,对于手势进行识别具有很广泛的应用。该作品以计算机自带的摄像头为硬件设备,以opencv库为算法基础,进行原始图像的采集和处理。结合MFC建立良好的人机交互系统,将采集的原始图像、处理得到的图像展示出来,具有一定的美感。该作品实现了设计要求的全部基本功能和拓展功能,同时附加数字识别和人脸检测拓展功能,能够进行多功能展示。 一、 题目分析 A. 设计要求 1、 基本要求 (1)基于摄像头获取的图像数据,实现手部检测; (2)实现拳头、剪刀、布三个手势的识别; (3)设计良好的人机界面,用于展示原始图像以及处理结果等信息; 2、 拓展要求 (1)控制鼠标完成移动、单击、双击、拖动等操作; (2)控制电脑关屏、开屏; (3)设计锥子剪刀布游戏播放提示语、判断胜负等; (4)实现空中手写轨迹识别; (5) 其他拓展功能。 B. 题目分析 肤色区域 打开摄像头并获取图像 图像预处理得到二值化图像 YCrCb 输出识别结果 辨别手指根数 定位手指 确认无误 二、 已实现功能 A. 基本要求 1、 打开摄像头并获取图像数据,实现手部检测 2、 实现拳头、剪刀、布三个手势的识别 3、 MFC良好的人机界面,用于展示原始图像以及处理结果等信息 B. 拓展要求 1、 控制鼠标完成移动、单击、双击、拖动等操作; 2、 控制电脑关屏、开屏 3、 锥子剪刀布游戏判断胜负、播放音乐、记录分数等 4、 实现空中手写轨迹识别 5、 实现05的数字识别 6、 实现人脸检测 三、 方案设计与选择 A. 手势分割方案 (1)方案1基于HSV色彩空间的肤色识别 HSVHue, Saturation, Value是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型Hexcone Model。、这个模型中颜色的参数分别是色调(H),饱和度(S),亮度(V)。从RGB到或HSV的转换关系如下 【1】 (2)方案2基于YCrCb色彩空间的肤色检测 1)、YCbCr分为Y,Cb,Cr三个分量,其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。 2)、阈值分割根据多次实验确定,正常黄种人的Cr分量大约在140175之间,Cb分量大约在100120之间。 3)、Opencv从RGB到YCrCb色彩空间的转换关系如下 【2】 (3)方案分析比较与选择 【3】 可以看出HSV颜色空间中H、S、V的标准差相对于YCrCb空间的标准差要大。而在YCrCb空间中,Y的标准差要明显大于其他两者。标准差越大则表明其值在亮度变化时波动大,因此选择标准差小的颜色通道比较好。 因此,选用方案2. B. 手势识别方案 (1)方案1重心距离法 见下图,红色点是手的重心,那么手的边缘的所有点与重心点的距离按顺时针方向或者逆时针方向遍历,就会出现五个峰值,分别是五个手指,这样我们就可以简单找到了。如果你是只伸出一两个手指,那么就只有一两个峰值了。 【4】 (2)方案2凸包检测法 【5】 如上图所示,黑色的轮廓线为convexityhull,而convexityhull与手掌之间的部分为convexitydefects.每个convexitydefect区域有四个特征量起始点(startPoint),结束点endPoint,距离convexityhull最远点farPoint,最远点到convexityhull的距离depth。 (3)方案分析比较与选择 在方案1中,按顺时针方向或者逆时针方向遍历出现峰值保持的点数超过80个即认为这个点是指尖,辨别存在偏差。在方案2中,通过凸包检测到的点集识别,只要有指尖凸包检测法就会检测到相关的点,这个点就是指尖。此法辨别率高。 因此,锤子剪刀布游戏对于指尖检测辨别率不高的识别方法选用方案1,数字识别对于指尖检测辨别率高的识别方法选用方案2. 四、 方案实施 得到二值化图像并以此作为掩码 迭代器访问CrCb元素 转换为YCrCb颜色空间 打开摄像头获取图像 A. 手势分割 与摄像头获得的原图像进行融合得到手的部分 形态学操作过滤噪点 代码实现 //肤色提取,skinArea为二值化肤色图像 void skinExtractconst Mat frame, Mat skinArea { Mat YCbCr; vectorMat planes; //转换为YCrCb颜色空间 cvtColorframe, YCbCr, CV_RGB2YCrCb; //将多通道图像分离为多个单通道图像 splitYCbCr, planes; //运用迭代器访问矩阵元素 MatIterator_uchar it_Cb planes[1].beginuchar, it_Cb_end planes[1].enduchar; MatIterator_uchar it_Cr planes[2].beginuchar; MatIterator_uchar it_skin skinArea.beginuchar; //人的皮肤颜色在YCbCr色度空间的分布范围100Cb127, 138Cr170 for ; it_Cb it_Cb_end; it_Cr, it_Cb, it_skin { if 100 *it_Cb *it_Cb 127 138 *it_Cr *it_Cr 170 *it_skin 255; else *it_skin 0; } // 形态学操作,去除噪声,并使手的边界更加清晰 Mat element getStructuringElementMORPH_RECT, Size3, 3; erodeskinArea, skinArea, element; morphologyExskinArea, skinArea, MORPH_OPEN, element; dilateskinArea, skinArea, element; morphologyExskinArea, skinArea, MORPH_CLOSE, element; } B. 重心距离法实现锤子剪刀布的游戏 点与重心的距离保持一定的点数 逆时针遍历轮廓点集 检测手的轮廓,得到轮廓点集 手的部分 输出结果并播放提示音 得到手势结果 代码实现 void CMF_ImageProcessingDlgOnBnClickedPlay { // TODO 在此添加控件通知处理程序代码 if musicFlag//如果原来正在播放,则先关闭 { MCIWndClosehMCI; MCIWndDestroyhMCI; } //首先显示原始图像 img frame.operator IplImage; DrawToMFCIDC_OriginalImage, img; skinArea.createframe.rows, frame.cols, CV_8UC1;//创建同frame大小的单通道8位矩阵 skinExtractframe, skinArea; Mat show_img; frame.copyToshow_img, skinArea;//skinArea作为掩码将frame拷贝至show_img vectorvectorPoint contours; // 轮廓的结构信息 vectorVec4i hierarchy;// 凸包络的点集 //寻找轮廓 findContoursskinArea, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE; // 找到最大的轮廓 int index;//最大轮廓索引 double area, maxArea0; for size_t i 0; i contours.size; i { area contourAreaMatcontours[i]; if area maxArea { maxArea area; index i; } } Moments moment momentsskinArea, true;//中心矩,用于计算重心 Point centerintmoment.m10 / moment.m00, intmoment.m01 / moment.m00; circleshow_img, center, 8, Scalar0, 0, 255, CV_FILLED;//画重心 // 寻找指尖 vectorPoint couPoint contours[index]; vectorPoint fingerTips;//指尖点 Point tmp; int max0, count0, notice0; int gesture 0,flag 0;//用于记录手指根数 for size_t i 0; i couPoint.size; i { tmp couPoint[i]; int dist intsqrttmp.x - center.x * tmp.x - center.x tmp.y - center.y * tmp.y - center.y; if dist max { max dist; notice i; count 0; } if dist max { count; if count 80// 计算最大值保持的点数,如果大于80,那么就认为这个是指尖 { count 0; max 0; bool flag false; // 低于手心的点不算 if center.y couPoint[notice].y continue; // 离得太近的不算 for size_t j 0; j fingerTips.size; j { if abscouPoint[notice].x - fingerTips[j].x 40 { flag true; break; } } if flag continue; fingerTips.push_backcouPoint[notice]; int dist intsqrtpowcouPoint[notice].x - center.x, 2 powcouPoint[notice].y - center.y, 2; if dist 125//点到重心的距离不小于125 { gesture; circleshow_img, couPoint[notice], 6, Scalar0, 255, 0, CV_FILLED; } //lineshow_img, center, couPoint[notice], Scalar255, 0, 0, 2; } } } if gesture 0 || gesture 1//0表示石头,1表示剪刀,2表示布 flag 0; else if gesture 2 flag 1; else flag 2; IplImage *showImage; showImage show_img.operator IplImage; DrawToMFCIDC_ShowResult, showImage; srandunsignedtimeNULL;//产生随机数 int r rand 3; int result judgeflag, r;//判断胜负 CString yourGes, compGes,res; CString choose;//音频 switch result { case 0 yourGes _T石头; compGes _T石头; res _T平手; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-忧伤还是快乐.mp3; //音乐文件的路径 break; case 1 yourMark; yourGes _T石头; compGes _T剪刀; res _T你赢了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-梦中的婚礼-[Mariage DAmour].mp3; break; case 2 computer; yourGes _T石头; compGes _T布; res _T你输了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-The Truth That You Leave.mp3; break; case 3 computer; yourGes _T剪刀; compGes _T石头; res _T你输了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-The Truth That You Leave.mp3; break; case 4 yourGes _T剪刀; compGes _T剪刀; res _T平手; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-忧伤还是快乐.mp3; //音乐文件的路径 break; case 5 yourMark; yourGes _T剪刀; compGes _T布; res _T你赢了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-梦中的婚礼-[Mariage DAmour].mp3; break; case 6 yourMark; yourGes _T布; compGes _T石头; res _T你赢了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-梦中的婚礼-[Mariage DAmour].mp3; break; case 7 computer; yourGes _T布; compGes _T剪刀; res _T你输了; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-The Truth That You Leave.mp3; break; case 8 yourGes _T布; compGes _T布; res _T平手; if musicPlay choose _TG\\KwDownload\\song\\纯音乐-忧伤还是快乐.mp3; //音乐文件的路径 break; default break; } yours.at_Td, yourMark; comp.at_Td, computer; SetDlgItemTextIDC_EDITYOURMARK, yours; SetDlgItemTextIDC_EDITCOMPUTER, comp; if NULL mTipDlg//如果还没有新建则创建 { mTipDlg new TipDlg; mTipDlg-CreateIDD_GAMEDIALOG, this; } mTipDlg-ShowWindowSW_SHOW; mTipDlg-SetDlgItemTextWIDC_EDITYOURS, yourGes; mTipDlg-SetDlgItemTextWIDC_EDITCOMPS, compGes; mTipDlg-SetDlgItemTextWIDC_EDITRESULT, res; UpdateDataFALSE; hMCI MCIWndCreateNULL, NULL, WS_POPUP | MCIWNDF_NOPLAYBAR | MCIWNDF_NOMENU, choose;//音频部分 MCIWndPlayhMCI; } C. 凸包检测法 点集筛选,每个指尖只画一个点 凸包检测得到凸包点集 轮廓检测得到最大轮廓 手的部分 输出结果 顺时针遍历确定每个指尖只画一个点 代码实现 Point gravity; int CMF_ImageProcessingDlgnumRecog { numResult NULL; skinArea.createframe.rows, frame.cols, CV_8UC1;//创建同frame大小的单通道8位矩阵 skinExtractframe, skinArea; frame.copyTonumResult, skinArea;//skinArea作为掩码将frame拷贝至show_img vector vectorPoint contours; // 轮廓 vector Vec4i hierarchy; // 轮廓的结构信息 vector Point hull; // 凸包络的点集 vectorPoint fingerTips;//指尖点 contours.clear; hierarchy.clear; fingerTips.clear; // 得到手的轮廓 findContoursskinArea, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE; Moments moment momentsskinArea, true;//中心矩,用于计算重心 Point centerintmoment.m10 / moment.m00, intmoment.m01 / moment.m00; circlenumResult, center, 8, Scalar0, 0, 255, CV_FILLED;//画重心 gravity center; // 找到最大的轮廓 int index;//最大轮廓索引 double area, maxArea0; for size_t i 0; i contours.size; i { area contourAreaMatcontours[i]; if area maxArea { maxArea area; index i; } } vectorPoint filterContours contours[index]; // 筛选后的轮廓 convexHullMatfilterContours, hull, true;// 得到轮廓的凸包络 int hullcount inthull.size; for int i 0; ihullcount - 1; i//逆时针遍历 { linenumResult, hull[i 1], hull[i], Scalar255, 0, 0, 2, CV_AA;//画凸包轮廓线 if center.y hull[i].y//低于重心的点不算 continue; if sqrtpowhull[i 1].x - hull[i].x, 2 powhull[i 1].y - hull[i].y, 2 40//两点之间的距离不小于40 { fingerTips.push_backhull[i]; } } linenumResult, hull[hullcount - 1], hull[0], Scalar255, 0, 0, 2, CV_AA;//终点到起始点的线段 for int j hullcount - 1; j 0; j--//顺时针遍历找最后一个指尖点 { if sqrtpowhull[j].x - hull[j - 1].x, 2 powhull[j].y - hull[j - 1].y, 2 40//两点之间的距离不小于40 { fingerTips.push_backhull[j]; break; } } int fingerNum 0; for size_t j fingerTips.size - 1; j 0; j--//画指尖点 { //两点之间的距离不小于40,点到重心的距离不小于112 if sqrtpowfingerTips[j].x - fingerTips[j - 1].x, 2 powfingerTips[j].y - fingerTips[j - 1].y, 2 40 intsqrtpowfingerTips[j].x - center.x, 2 powfingerTips[j].y - center.y, 2 112 { circlenumResult, fingerTips[j], 6, Scalar0, 255, 0, CV_FILLED; fingerNum; } } if intsqrtpowfingerTips[0].x - center.x, 2 powfingerTips[0].y - center.y, 2 112 intsqrtpowfingerTips[0].x - fingerTips[fingerTips.size - 1].x, 2 powfingerTips[0].y - fingerTips[fingerTips.size - 1].y, 2 40//点到重心的距离不小于112同时第一个点和最后一个点的距离大于40 { circlenumResult, fingerTips[0], 6, Scalar0, 255, 0, CV_FILLED; fingerNum; } return fingerNum; } 手的部分 D. 鼠标控制 鼠标响应 辨别手指根数,控制鼠标 手指根数 鼠标响应 0 移动 1 单击左键 2 单击右键 3 双击左键 4 拖动 5 松开左键 5 结束线程,退出鼠标控制 代码实现 void CMF_ImageProcessingDlgBnClickedBtmouse// 主要处理函数在这里写 { this-SetCapture;//捕获鼠标消息 threadFlag true;//线程启动标志MF_ImageProcessing cap.open0; cap frame; delayms1000; int l 1, r 1;//单击标志 int x, y;//鼠标坐标 int fingerNum; IplImage *showImage; Point point; while true { delayms5; fingerNum numRecog; showImage numResult.operator IplImage; DrawToMFCIDC_ShowImage, showImage; point gravity; if fingerNum 0//移动 { x intpoint.x * 1550 / showImage-width;//屏幕宽1366,高768 y intpoint.y * 850 / showImage-height; mouse_eventMOUSEEVENTF_MOVE, 0, 0, 0, 0; SetCursorPosx, y; l 1; r 1; } else if fingerNum 1//单击左键 { if l 1 { mouse_eventMOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0; l 0; } r 1; } else if fingerNum 2//单击右键 { if r 1 { mouse_eventMOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0; r 0; } l 1; } else if fingerNum 3//双击 { if l 1 { mouse_eventMOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0; l 0; } r 1; } else if fingerNum 4//单击拖动 { if l 1 { mouse_eventMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0; l 0; } x intpoint.x * 1366 / showImage-width; y intpoint.y * 768 / showImage-height; SetCursorPosx, y; r 1; } else if fingerNum 5//松开左键 { if l 0 mouse_eventMOUSEEVENTF_LEFTUP, 0, 0, 0, 0; l 1; r 1; } if fingerNum 3 return; if threadFlag//关闭摄像头按钮被按下,结束线程 return; } } 获取摄像头图像 E. 人脸识别 识别并标记输出 加载Haar特征分类器 代码实现 void CMF_ImageProcessingDlgOnBnClickedBtfacedetect { // TODO 在此添加控件通知处理程序代码 img frame.operator IplImage; Mat faceDetImgimg; const char *pStrCascadeFileName haarcascade_frontalface_alt.xml; CvHaarClassifierCascade *pHaarCascade NULL; pHaarCascade CvHaarClassifierCascade*cvLoadpStrCascadeFileName; IplImage *pGrayImage cvCreateImagecvGetSizeimg, IPL_DEPTH_8U, 1; cvCvtColorimg, pGrayImage, CV_BGR2GRAY; // 人脸识别与标记 if pHaarCascade NULL { CvScalar FaceCirclecolors[] { { { 0, 0, 255 } }, { { 0, 128, 255 } }, { { 0, 255, 255 } }, { { 0, 255, 0 } }, { { 255, 128, 0 } }, { { 255, 255, 0 } }, { { 255, 0, 0 } }, { { 255, 0, 255 } } }; CvMemStorage *pcvMStorage cvCreateMemStorage0; cvClearMemStoragepcvMStorage; // 识别 DWORD dwTimeBegin, dwTimeEnd; dwTimeBegin GetTickCount; CvSeq *pcvSeqFaces cvHaarDetectObjectspGrayImage, pHaarCascade, pcvMStorage; dwTimeEnd GetTickCount; //AfxMessageBoxTEXT共检测出人数d,使用时间f, pcvSeqFaces-total, dwTimeEnd; // 标记 for int i 0; i pcvSeqFaces-total; i { CvRect* r CvRect*cvGetSeqElempcvSeqFaces, i; Rect face_region; face_region.x r-x; face_region.y r-y; face_region.width r-width; face_region.height r-height; rectanglefaceDetImg, face_region, FaceCirclecolors[i 8], 1, 8, 0;//矩形标记 } cvReleaseMemStoragepcvMStorage; } IplImage *face_detect; face_detect faceDetImg.operator IplImage; DrawToMFCIDC_OriginalImage, face_detect; } 五、 调试及成品展示 A. MFC人机交互界面 B. 锤

    注意事项

    本文(基于“手势识别”的人机交互系统设计.docx)为本站会员(admin)主动上传,工友文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知工友文库(发送邮件至gydoc@qq.com或直接QQ联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    copyright@ 2019-2022 工友文库网站版权所有
    经营许可证编号:鲁ICP备19032292号-1


    1
    收起
    展开