求一款手机游戏,通过手势来控制格斗机器人名人堂格斗

求一款手机游戏,通过手势来控制机器人格斗_百度知道
求一款手机游戏,通过手势来控制机器人格斗
求一款手机游戏,通过手势来控制机器人格斗
下载起来游戏安全方便,不过这个手机游戏很高的配置要求不管你需要什么类型的游戏和版本哪里都有的,在应用宝能下载到的你就去哪里找吧你说的是一款智能手机游戏
其他类似问题
为您推荐:
手机游戏的相关知识
其他1条回答
亡灵杀手。。。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁欢迎来到日本通
& 可以用声音或者手势操控的感应机器人玩具
可以用声音或者手势操控的感应机器人玩具
摘要:多美公司推出次世代感应机器人玩具“omnibot”系列,将在全国各个玩具专卖店、百货店、家电量贩店等发售。
日本公司推出次世代“”系列,将在全国各个玩具专卖店、百货店、家电量贩店等发售。系列第一弹的两个作品“Hello!&MiP”和“Hello!&Zoomer”的发售日定为6月21日和7月26日。官方售价皆为15000日元(不含税)。“Hello!&MiP”可以对人类的手部动作作出反应,并且在下载专用软件后可以使用智能手机操控,甚至能用来搬运物品。“Hello!&MiP”的本体大小为130 x 190 x
70mm,重量为350g。&“Hello!&Zoomer”则可以对人声作出反应。可以识别30个以上的日语单词和15个以上的英语单词。和“Hello!&MiP”一样,前方装有红外感应器可以识别物体。“Hello!&Zoomer”的本体大小为280×200×180mm,重量为520g&“omnibot”的目标是3年后达成50亿日元市场规模。&(日本通编译,转载请附上原文链接)
我有新看法:
&&&日本通微信去年我做了一段时间和LEGO EV3 的研究,当时已经开发了iOS的EV3 版SDK,能够使得iOS与EV3进行互动,但这还远远达不到我曾经设想的效果,且看我之前的博文:
【iOS与EV3混合机器人系列之一】iOS要干嘛?EV3可以更酷!
http://blog.csdn.net/songrotek/article/details/
iPhone不仅仅要作为EV3 的大脑,还要是EV3的眼睛,脸,还有姿态感觉(陀螺仪)。因此,我之后转向视觉的研究,就是希望使iPhone可以变成EV3的眼睛。
前两篇关于OpenCV for iOS的只是分享搭建平台的基本方法,本篇文章将分享更具体的实践,就是用的识别手势,然后控制EV3机器人的行走:
视频链接:
/v_show/id_XODU1NTcxMDIw.html?from=s1.8-1-1.2
这边我暂时不便放出整个,但在这里分享我的思路还有一些关键代码。
2 获取视频帧能够进行处理
这个在前面的OpenCV for iOS 2 blog有介绍:
http://blog.csdn.net/songrotek/article/details/
- (void)processImage:(cv::Mat &)image
[self handDetectionWithImage:image];
这里我把手势检测的放在一个method中进行处理,接下来一步一步介绍手势的处理流程:
OpenCV手势处理流程
Step 1:通过HLS颜色获取可能是手的区域并处理
我采用HLS颜色区域来获取皮肤区域,如果是手的话当然就是手的区域。
// Step 1.1:模糊处理
//medianBlur(image, blurImage, 5);
// Step 1.2:转换为HLS颜色
cvtColor(image, HLSimage, CV_BGR2HLS);
// Step 1.3:根据皮肤颜色范围获取皮肤区域:
int imageRow = HLSimage.
int imageCol = HLSimage.
for (int row = 0; row & imageR row++) {
for (int col = 0; col & imageC col++) {
uchar H = HLSimage.at&cv::Vec3b&(row,col)[0];
uchar L = HLSimage.at&cv::Vec3b&(row,col)[1];
uchar S = HLSimage.at&cv::Vec3b&(row,col)[2];
double LS_ratio = ((double) L) / ((double) S);
bool skin_pixel = (S &= 50) && (LS_ratio & 0.5) && (LS_ratio & 3.0) && ((H &= 14) || (H &= 165));
if (!skin_pixel) {
HLSimage.at&cv::Vec3b&(row,col)[0] = 0;
HLSimage.at&cv::Vec3b&(row,col)[1] = 0;
HLSimage.at&cv::Vec3b&(row,col)[2] = 0;
// Step 1.4: 转换为RGB
cvtColor(HLSimage, skinImage, CV_HLS2RGB);
// Step 1.5: 对皮肤区域进行二值及平滑处理
cvtColor(skinImage, gray, CV_RGB2GRAY);
threshold(gray, binary, 50, 255, THRESH_BINARY);
Step 2: 利用YUV的U分量获取轮廓并进行形态学操作利用边缘分离相同颜色区域
比如说手和脸的颜色是一样的,那么用他们的边缘分开,U分量的边缘比较明显:
// Step 2.1:转换为YUV
cvtColor(image, yuvImage, CV_BGR2YUV);
// Step 2.2:取出U分量
vector&Mat& yuvI
split(yuvImage, yuvImages);
Mat& uImage = yuvImages[1];
// Step 2.3: 形态学梯度操作
Mat structure_element(5, 5, CV_8U, Scalar(1));
morphologyEx(uImage, uImage, MORPH_GRADIENT, structure_element);
threshold(uImage, uImage, 10, 255, THRESH_BINARY_INV|THRESH_OTSU);
medianBlur(binary, binary, 5);
//morphologyEx( binary, binary, MORPH_CLOSE,Mat());
//morphologyEx( binary, binary, MORPH_OPEN,Mat());
for (int row = 0; row & imageR row++) {
for (int col = 0; col & imageC col++) {
binary.at&uchar&(row,col) = uImage.at&uchar&(row,col) & binary.at&uchar&(row,col);
Step 3 :获取可能是手的轮廓区域并进行处理获得多边形角点
// Step 3.1:寻找轮廓
vector&vector&cv::Point&&
vector&Vec4i&
findContours( binary, contours, hierarchy,
CV_RETR_TREE, CV_CHAIN_APPROX_NONE );
// Step 3.2:找到最大轮廓
int indexOfBiggestContour = -1;
int sizeOfBiggestContour = 0;
for (int i = 0; i & contours.size(); i++){
if(contours[i].size() & sizeOfBiggestContour){
sizeOfBiggestContour = int(contours[i].size());
indexOfBiggestContour =
// Step 3.3:检查轮廓,获取手的信息
if(indexOfBiggestContour & -1 && sizeOfBiggestContour & 400)
// 获取轮廓多边形
approxPolyDP(Mat(contours[indexOfBiggestContour]), contours[indexOfBiggestContour], 1.5, true);
// 获取轮廓矩形框
cv::Rect rect = boundingRect(Mat(contours[indexOfBiggestContour]));
cv::RotatedRect rotatedRect = fitEllipse(Mat(contours[indexOfBiggestContour]));
angle = rotatedRect.
power = rotatedRect.size.height/rotatedRect.size.
//NSLog(@"power:%f angle:%f\n",power,angle);
//ellipse(image, rotatedRect, Scalar(0,0,200));
Point2f rect_points[4];
rotatedRect.points( rect_points );
for( int j = 0; j & 4; j++ )
line( image, rect_points[j], rect_points[(j+1)%4], Scalar(0,0,200), 1, 8 );
Mat temp =
cv::Rect saveR
if (rect.width & rect.height) {
saveRect = cv::Rect(rect.x,rect.y -(rect.width/2 - rect.height/2),rect.width,rect.width);
saveRect = cv::Rect(rect.x - (rect.height/2 - rect.width/2),rect.y,rect.height,rect.height);
//tempRect = CGRectMake(saveRect.x, saveRect.y, saveRect.width, saveRect.height);
if (saveRect.x &= 0 && saveRect.y &= 0 && saveRect.x+saveRect.width &= temp.cols && saveRect.y+saveRect.height &= temp.rows) {
ROIImage = temp(saveRect);
CvSize size(96,96);
resize(ROIImage, ROIImage, size);
tempImage = [self UIImageFromCVMat:ROIImage];
rectangle(image, saveRect.tl(), saveRect.br(), Scalar(0,0,200));
// 在image中画出轮廓
drawContours(image, contours, indexOfBiggestContour, Scalar(255,100,100));
Step 4:获取手指信息
在获取手的轮廓之后,采用U型曲线检测来获取手指信息
// 检测手指
vector&cv::Point& uP
uPoints = detectUcurveWithContour(contours[indexOfBiggestContour]);
for (int i = 0; i & uPoints.size(); i++) {
circle(image,uPoints[i], 3, Scalar(100,255,255), 2);
fingerTipsNum = (int)uPoints.size();
vector&cv::Point& detectUcurveWithContour(vector&cv::Point& contour)
cv::Rect rect = boundingRect(contour);
float toleranceMin = rect.height/5;
//float toleranceMax =
rect.height*0.8;
// Step 0: 平滑一下曲线
for (int i = 1; i & contour.size() - 1; i++) {
contour[i].x = (contour[i-1].x + contour[i].x + contour[i+1].x)/3;
contour[i].y = (contour[i-1].y + contour[i].y + contour[i+1].y)/3;
vector&cv::Point& uP
// Step 1:计算每个点与相邻点形成的夹角
vector&float&
int size = int(contour.size());
int step = 5;
for (int i = 0; i & i++) {
int index1 = i -
int index2 =
int index3 = i +
index1 = index1 & 0 ? index1 + size : index1;
index3 = index3 &= size ? index3 - size : index3;
angles.push_back(getAngleWithDirection(contour[index1], contour[index2], contour[index3]));
// Step 2: 计算先变小后变大的点,并记录
float thresholdAngleMax = 50;
//float thresholdAngleMin = 0;
for (int i = 0; i & i++) {
int index1 = i - 1;
int index2 =
int index3 = i+1;
int index4 = i+
int index5 = i-
index1 = index1 & 0 ? index1+size:index1;
index3 = index3 &= size? index3-size:index3;
index5 = index5 & 0 ? index5+size:index5;
index4 = index4 &= size? index4-size:index4;
if (angles[index2] & angles[index1] && angles[index2] & angles[index3] && angles[i] & 0 && angles[i] & thresholdAngleMax) {
float dis1 = distanceP2P(contour[i], contour[index4]);
float dis2 = distanceP2P(contour[index5], contour[i]);
//NSLog(@"dis:%f,tor:%f",dis,toleranceMin);
if (dis1 & toleranceMin || dis2 & toleranceMin) {
uPoints.push_back(contour[i]);
//NSLog(@"angel:%f",angles[i]);
辅助函数用C++写:
float distanceP2P(cv::Point a, cv::Point b){
float d= sqrt(fabs( pow(a.x-b.x,2) + pow(a.y-b.y,2) )) ;
float getAngleWithDirection(cv::Point s, cv::Point f, cv::Point e){
float l1 = distanceP2P(f,s);
float l2 = distanceP2P(f,e);
float dot=(s.x-f.x)*(e.x-f.x) + (s.y-f.y)*(e.y-f.y);
float angle = acos(dot/(l1*l2));
angle=angle*180/M_PI;
// 计算从s到f到e的旋转方向
cv::Point f2s = cv::Point(s.x - f.x,s.y-f.y);
cv::Point f2e = cv::Point(e.x - f.x,e.y - f.y);
float direction = f2s.x*f2e.y - f2e.x*f2s.y;
if (direction & 0 ) {
return angle;
return -angle;
float getAngle(cv::Point s, cv::Point f, cv::Point e){
float l1 = distanceP2P(f,s);
float l2 = distanceP2P(f,e);
float dot=(s.x-f.x)*(e.x-f.x) + (s.y-f.y)*(e.y-f.y);
float angle = acos(dot/(l1*l2));
angle=angle*180/M_PI;
return angle;
得到的结果如下图:
在光线充足的情况下,效果还是很不错的。
接下来就是利用手势的结果控制EV3了:
基本代码:
if (fingerTipsNum &= 3) {
int leftPower = int(power * 40 + (angle - 90)*0.4);
int rightPower = int(power * 40 - (angle - 90)*0.4);
leftPower = leftPower & 100? 100:leftP
rightPower = rightPower & 100? 100:rightP
leftPower = leftPower & -100? -100:leftP
rightPower = rightPower & -100? -100:rightP
NSData *data = [EV3Directer turnMotorsAtPort:EV3OutputPortB power:leftPower port:EV3OutputPortD power:rightPower];
[[EADSessionController sharedController] writeData:data];
} else if (fingerTipsNum == 2)
int leftPower = int(power * 40 + (angle - 90)*0.4);
int rightPower = int(power * 40 - (angle - 90)*0.4);
leftPower = leftPower & 100? 100:leftP
rightPower = rightPower & 100? 100:rightP
leftPower = leftPower & -100? -100:leftP
rightPower = rightPower & -100? -100:rightP
NSData *data = [EV3DirectCommander turnMotorsAtPort:EV3OutputPortB power:-leftPower port:EV3OutputPortD power:-rightPower];
[[EADSessionController sharedController] writeData:data];
} else if (fingerTipsNum &= 1)
NSData *data = [EV3DirectCommander turnMotorAtPort:EV3OutputPortBD power:0];
[[EADSessionController sharedController] writeData:data];
这样伸出不同手指就有不同的控制指令了。
整体思路就写到这吧!期待交流!
版权声明:本文为博主原创文章,未经博主允许不得转载。好玩的安卓手势游戏推荐_安卓手势游戏排行
|||||||跑跑车安卓下载站
最新合集角色扮演动作冒险体育运动益智休闲棋牌游戏模拟经营射击游戏策略塔防赛车竞速安卓网游安卓软件
安卓手势游戏好玩的安卓手势游戏推荐,手势游戏是一种好玩的通过手指触摸屏幕来控制游戏的休闲游戏,跑跑车为您提供手机手势游戏大全,种类丰富总有一款是您的最爱,快来挑选吧。
大小:27.5M 手势舞蹈是一款简单好玩的音乐舞蹈游戏,玩家通过滑屏或者手势进行跳舞,玩起来十分有意思。
大小:21.4M alaaaash游戏下载,SLAAAASH是一款画风看着意外爽快的益智游戏,玩家需要在限定的步骤内用手指滑动切割部件,打败敌人。
大小:30.9M 方块弹球下载,方块弹球(Smashy Brick)是一款涂鸦画风的打砖块游戏,画面挺赞的,玩家需要画出接球的挡板。
大小:48.2M 指尖童话破解版下载,指尖童话是一款画风很赞的趣味手势游戏,游戏已破解内购,购买直接成功,推荐使用飞行模式购买。
大小:6.8M 霓虹破解(Neon Hack)是一款十分简单易上手的划屏类手机游戏,这款游戏十分的考验玩家的逻辑思维能力,需要你能够在九宫格中解出正确的答案!
大小:49.1M 剪影大师破解版是一款具有艺术风格的手势塔防游戏,画出各种符号,打造出最强的勇士,新颖的剪纸画风,让这款游戏透漏着一股民间艺术风味。
大小:41.5M 剪影大师下载,剪影大师Tok Dalang是一款卡通剪影画风的塔防游戏,玩法很有趣,通过手势画出图形来制作兵队,进攻打倒敌人吧。
大小:17.5M 道场大师游戏下载,道场大师(Dojo Master)是一款根据顺序滑动手指按顺序击杀敌人的游戏,还是很有挑战性的哦,快来试试吧。
大小:68.7M darklings安卓版下载,暗夜之光Darklings是一款画面精致音乐精美的魔幻风格的无尽冒险游戏,新颖的手势操作也很有趣,推荐给大家。
大小:160.8M 剑魂之刃360版是一款MMOACT全球首款手势操控格斗手游。游戏以微操作格斗作为核心玩法,以带动全身感官作为体验感受,凭借超真实打击感给予玩家全方位的战斗娱乐体验。
大小:43.8M 魔法触摸:雇佣巫师是一款像素风休闲游戏,游戏中玩家将扮演一名会使用魔法咒语的巫师,消灭从天而降的敌人保卫城堡,玩法很特别推荐给大家。
大小:7.7M 《击落企鹅》是一款发射跑跑击落空中飞行的企鹅的一款安卓休闲游戏。
大小:3.9M 动感极限摩托是一款摩托车物理比赛的Android游戏,采用重力感应和触摸屏控制,是款能够让你轻易上瘾的摩托竞速游戏。
大小:4.1M 手势控下载,手势控是一款非常有趣的敏捷类休闲游戏。游戏中玩家需要根据文字提示做出相应的手势即可,非常考验玩家的反应能力哦~
大小:41.8M 银河护卫队:超级武器下载,银河护卫队:超级武器是一款非常有趣的策略性格斗游戏。作为银河护卫队一员玩家将肩负起保卫宇宙银河的重任,赶紧拿起手中的超级武器战斗吧~操作简单容易上手。
大小:22.1M 手势挑战安卓下载,手势挑战是一款非常有趣的敏捷类休闲游戏。游戏采用简约色彩的画风设计十分精美小清新,操作简单容易上手,丰富的游戏内容和有趣具有挑战性的玩法将带给玩家乐趣无穷的游戏体验~
大小:337.2M 咒灵诞生安卓版下载,这是一款很不错动作游戏,虚幻3引擎制作、画面效果非常棒。

我要回帖

更多关于 街机 格斗 机器人 的文章

 

随机推荐