`

用openvc 控制鼠标 来移动和打开文件

阅读更多

这一阵做了冷板凳。蛋有淡淡的忧伤。开始吓唬闹ing....................

 

需求:

有时候坐在离鼠标比较远的地方(比如推到沙发上)看网页,看电影要用鼠标去控制,还得蹭过去。写个用握拳挥动来控制鼠标移动,用掌来打开文件的程序。

打算到时候可以移到自家android电视上去。

 

困难:

之前也没有写过c 语言程序(还读书的时候考级用过),开始看opencv 更是雾水,还好 “凡是不决问狗狗”。顺便蛋伤下:狗狗提供的不只是口粮,还有思想。 

 

 

 

 

,另外,我想写一个基于图片中实物分类的程序,作用是可以从网上自动down 图片,然后按照要的分类 比如 鲜花 或者 狗狗  来自动保存和分类。  爬虫  存储 ,分类和展示 用 jsoup  ,mongo gridfs,  spring mvc  和 js 已完成。准备训练大量的不同事务的分级文件。有兴趣多交流。

 

下面是代码    

大概步骤

0、在系统查看的方法是 cat /proc/bus/input/devices 就可以看到每个eventX是什么设备的事件了

1、抓视频,帧  处理

2、看有没有 手掌 (双击) 和拳头移动(鼠标移动),有的化就处理。

 

 

 

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <string.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <linux/input.h>

#include <linux/uinput.h>

#include <stdio.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

#include <iostream>

#include <stdlib.h>

#include <pthread.h>

 

using namespace std;

using namespace cv;

 

 

void mousemove(int fd, int x, int y);

void mousedoubleclick(int fd);

 

void fist(Mat frame);

void palm(Mat frame);

 

void *thread1(void *);

 

struct mypoint {

int x1;

int y1;

 

};

 

mypoint p;

 

int fd_mouse;

 

//  这两个链接分类的文件我是从 qq 手势 里扣出来的,正准备自己训练几个不同手势的文件

String palmfile = "data/mycascade/palm.dat";

String fistfile = "data/mycascade/fist.dat";

 

int xarray = 0;

int yarray = 0;

 

int movex = 0;

int movey = 0;

 

int palmcount = 0;

int fistcount = 0;

 

bool waitfist = false;

bool waitpalm = false;

 

bool isfirst = true;

 

pthread_t pid1;

 

float lv = 1;

 

CascadeClassifier palm_cascade;

CascadeClassifier fist_cascade;

 

//string window_name = "Capture - Face detection";

 

int objectDetectionxx(int argc, char** argv)

 

{

 

CvCapture* capture;

Mat frame;

 

 

 

if (!palm_cascade.load(palmfile)) {

printf("--(!)Error loading\n");

return -1;

};

if (!fist_cascade.load(fistfile)) {

printf("--(!)Error loading\n");

return -1;

};

 

 

    //打开鼠标文件  不同机器可能不一样 我的

fd_mouse = open("/dev/input/event3", O_RDWR);

 

if (fd_mouse <= 0) {

printf("error open mouse/n  please chmod +wr /dev/input/e*");

 

}

 

capture = cvCaptureFromCAM(-1);

Mat frame_gray;

 

if (capture) {

 

while (true) {

 

frame = cvQueryFrame(capture);

if (!frame.empty()) {

 

cvtColor(frame, frame_gray, CV_BGR2GRAY);

 

equalizeHist(frame_gray, frame_gray);

 

 

                //再 双击有有各线程设置waitfist这个值, 这个线程主要是睡  防止双击频繁

if (!waitfist) {

 

palm(frame_gray);

}

 

if (!waitpalm) {

fist(frame_gray);

 

}

 

// imshow(window_name, frame_gray);

 

} else {

printf(" --(!) No captured frame -- Break!");

break;

}

 

waitKey(10);

// int c = waitKey(50);

// if ((char) c == 'c') {

// break;

// }

}

}

return 0;

}

 

 

 

//测试视频中是否有 手掌出现, 手掌一出现 鼠标停止移动,双击

void palm(Mat frame) {

 

std::vector<Rect> palmrect;

 

palm_cascade.detectMultiScale(frame, palmrect, 1.1, 2,

0 | CV_HAAR_SCALE_IMAGE, Size(70, 70));

 

if (palmrect.size() > 0) {

 

fistcount++;

 

if (fistcount == 3) {

 

if (pthread_create(&pid1, NULL, thread1, NULL) != 0) {

printf("create thread1 failed/n");

}

 

mousedoubleclick(fd_mouse);

 

}

 

} else {

 

fistcount = 0;

}

 

}

 

//检测是否有拳头出现  出想的坐标

void fist(Mat frame) {

 

 

 

std::vector<Rect> fistrect;

 

//-- Detect faces

fist_cascade.detectMultiScale(frame, fistrect, 1.1, 2,

0 | CV_HAAR_SCALE_IMAGE, Size(80, 80));

 

if (fistrect.size() > 0) {

 

palmcount = 0;

 

p.x1 = fistrect[0].x + fistrect[0].width * 0.5;

p.y1 = fistrect[0].y + fistrect[0].width * 0.5;

 

// Point center(fistrect[0].x + fistrect[0].width * 0.5,

// fistrect[0].y + fistrect[0].height * 0.5);

// ellipse(frame, center,

// Size(fistrect[0].width * 0.5, fistrect[0].height * 0.5), 0, 0,

// 360, Scalar(255, 0, 0), 2, 8, 0);

 

if ((xarray - p.x1) * (xarray - p.x1) > 25

&& (p.y1 - yarray) * (p.y1 - yarray) > 25) {

 

if (xarray != 0) {

 

mousemove(fd_mouse, lv * (xarray - p.x1), lv * (p.y1 - yarray));

 

cout << "palm:" << "movex:=" << lv * (xarray - p.x1) << "nx:="

<< p.x1 << "ox:=" << xarray << endl;

cout << "palm:" << "movey:=" << lv * (p.y1 - yarray) << "ny:="

<< p.y1 << "oy:=" << yarray << endl;

xarray = p.x1;

yarray = p.y1;

} else {

xarray = p.x1;

yarray = p.y1;

}

}

 

} else {

 

palmcount++;

 

if (palmcount > 5) {

palmcount = 0;

xarray = 0;

yarray = 0;

}

}

 

}

 

 

//鼠标移动

void mousemove(int fd, int x, int y) {

struct input_event event;

 

memset(&event, 0, sizeof(event));

gettimeofday(&event.time, NULL);

event.type = EV_REL;

event.code = REL_X;

event.value = x;

write(fd, &event, sizeof(event));

 

event.type = EV_REL;

event.code = REL_Y;

event.value = y;

write(fd, &event, sizeof(event));

 

event.type = EV_SYN;

event.code = SYN_REPORT;

event.value = 0;

write(fd, &event, sizeof(event));

 

}

 

 

//鼠标左键双击

void mousedoubleclick(int fd) {

struct input_event event;

memset(&event, 0, sizeof(event));

gettimeofday(&event.time, NULL);

 

event.type = EV_KEY;

event.code = BTN_LEFT;

event.value = 1;

write(fd, &event, sizeof(event));

 

event.type = EV_KEY;

event.code = BTN_LEFT;

event.value = 0;

write(fd, &event, sizeof(event));

 

event.type = EV_KEY;

event.code = BTN_LEFT;

event.value = 1;

write(fd, &event, sizeof(event));

 

event.type = EV_KEY;

event.code = BTN_LEFT;

event.value = 0;

write(fd, &event, sizeof(event));

 

event.type = EV_SYN;

event.code = SYN_REPORT;

event.value = 0;

write(fd, &event, sizeof(event));

 

}

 

 

//当鼠标双击后会触发这个线程 ,这个线程的左右是 防止重复的双击

void *thread1(void *) {

 

cout << "fist:" << "waitfist begin!  double click" << endl;

waitfist = true;

waitpalm = true;

usleep(100 * 1000);

waitpalm = false;

usleep(200 * 1000);

 

cout << "fist:waitfist end!" << endl;

waitfist = false;

 

}

 

分享到:
评论

相关推荐

    手势跟踪 鼠标控制 opencv

    总的来说,这个项目旨在结合OpenCV的图像处理能力和计算机视觉技术,创建一个能够通过手势控制鼠标的系统。它不仅展示了OpenCV的强大功能,也为实际应用如无障碍技术、游戏交互等提供了一种创新的输入方式。通过学习...

    手势识别控制鼠标

    本项目利用VC++编程语言和OpenCV(Open Source Computer Vision Library)库实现了手势识别以控制鼠标的移动及鼠标左键、右键的点击操作。以下将详细讲解这一技术的核心知识点。 首先,OpenCV是一个强大的计算机...

    基于opencv+Mediapipe+CNN实现用手势识别控制对鼠标操控源码+项目说明+exe可执行程序+设计文档

    指尖移动来操控鼠标移动:通过手指的相对移动与移动的速度来操纵鼠标的移动 手势操控实现鼠标点击功能:通过指尖的特定动作实现鼠标的点击 手势操控实现滚动页面:通过特定的手势实现页面的滚动 键盘操作 指尖操控...

    QT 图像打开工具

    QT图像打开工具是一种基于QT框架并利用OpenCV库来实现图像查看和处理的应用程序。QT是一个流行的开源跨平台应用程序开发框架,广泛应用于GUI(图形用户界面)设计,而OpenCV则是一个强大的计算机视觉库,提供了丰富...

    在图像上实现鼠标交互,选择感兴趣区域进行处理

    在MFC中,这通常通过CFileDialog类来实现,用户可以通过对话框选择图像文件,然后使用OpenCV的imread函数读取图像到内存中。 接着,"鼠标在图像上移动进行选择感兴趣区域"是通过响应鼠标消息来完成的。MFC提供了...

    Halcon+MFC,实现(1)鼠标对图像进行缩放、拖拽(2)添加滚动条

    2. **处理鼠标消息:** 你需要捕获鼠标消息,如`WM_LBUTTONDOWN`(左键按下)、`WM_MOUSEMOVE`(鼠标移动)和`WM_LBUTTONUP`(左键释放)。当用户点击并拖动鼠标时,根据鼠标的位置计算出缩放和平移的参数。 3. **...

    第1章 OpenCV的GUI特性.zip

    OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉工具,被广泛应用于图像分析、机器学习、深度学习等领域。GUI(图形用户界面)特性是OpenCV中的一个重要组成部分,它使得开发者可以创建交互式的可视化...

    鼠标控制在图上画线并显示长度

    3. **画线**:在鼠标移动时,我们可以使用`cv2.line()`函数在图像上绘制线段。该函数需要四个参数:目标图像、起点、终点、线条颜色和线条宽度。 4. **计算长度**:利用欧几里得距离公式,我们可以轻松地计算出两点...

    c# GDI+画图用鼠标绘制直线、矩形、椭圆

    例如,使用TrackBar控件来控制旋转角度,使用两个Button控件分别进行平移和缩放操作。然后在事件处理程序中,应用Transformations到Graphics对象上: ```csharp private void buttonTranslate_Click(object sender,...

    课程设计-基于MediaPipe+opencv+PySide2+PyGame开发的手势识别系统Python源码+文档说明+界面

    虚拟鼠标控制:使用食指在屏幕前移动,可控制电脑鼠标移动 虚拟键盘控制:当食指在虚拟键盘前滑过时,对应键帽会进行显示,当食指指尖与中指指尖进行并拢时可触发键盘点击操作 账号:ADMIN 密码:123 手势控制音乐...

    Python-OpenCV-Paint:使用Tkinter和OpenCV简单网络摄像头绘画程序

    在本项目"Python-OpenCV-Paint"中,开发者创建了一个使用Tkinter和OpenCV库的简单网络摄像头绘画程序。这个程序允许用户通过摄像头捕捉实时画面,并在其上进行绘画操作,实现了增强现实(Augmented Reality)的效果...

    c#摄像头加固定大小矩形框可移动截取相片

    要在摄像头预览图像上绘制可移动的矩形框,需要利用Graphics类进行图形绘制,并设置鼠标事件处理器,如MouseDown、MouseMove和MouseUp,来捕捉用户的拖动操作,实时更新矩形框的位置。 6. **图像截取与保存**: ...

    视频目标标注2

    3. **视频播放**:在OpenCV中,`VideoCapture`对象用于打开和读取视频文件。通过循环调用`read`函数,可以逐帧获取视频数据,然后使用`imshow`显示每一帧图像。同时,可以设置定时器来控制播放速度。 4. **鼠标事件...

    基于机器视觉的动态手势识别人机交互系统.rar

    这一系统的核心在于通过识别特定的手势来控制鼠标操作,如移动、点击(单击和双击)、右键菜单等,进一步实现文件管理功能,如打开文件夹、移动文件和删除文件。 首先,项目涉及到的关键技术之一是动态手势识别。...

    qt_camera.rar

    例如,`mouseMoveEvent`用于处理鼠标移动,`mousePressEvent`和`mouseReleaseEvent`用于识别拖动开始和结束,`resizeEvent`则处理窗口大小改变的事件。 总结起来,qt_camera.rar项目是一个综合运用了Qt5、C++和...

    autohotkey_l

    用户可以定义自己的热键(快捷键)来执行预设的命令或脚本,比如用一个简单的组合键打开经常使用的应用程序、快速复制粘贴文本,甚至可以创建复杂的宏命令来完成一系列连续操作。 **2. 脚本语言:** AHK_L提供了一...

    VB设计多媒体播放器

    VB提供`OpenFile`、`CloseFile`等函数进行文件的打开和关闭,同时需要了解多媒体文件格式(如MP3、WAV、MP4、WMV等)以便正确读取和播放。 6. **状态管理**:播放器需要跟踪和管理播放状态,如播放/暂停/停止、音量...

    屏幕录制软件,可以捕获鼠标,音频,屏幕,简单好用,就是安装有点复杂,需要懂基本的计算机编程

    在这款软件中,开发者可能利用了`pyautogui`库来跟踪和记录鼠标的移动和点击,`pygame`或`vlc`库来处理音频录制,以及`opencv`或`PIL`库来捕捉和处理屏幕图像。 录屏功能是软件的核心,通常通过连续抓取屏幕图像并...

    实现qt QGraphicsView放大缩小功能的类

    `zoomIn`和`zoomOut`方法则实际执行放大和缩小的操作,它们可能通过修改`QGraphicsView`的`scale`属性来实现,如`m_view-&gt;setTransformationAnchor(QGraphicsView::AnchorUnderMouse);`确保缩放中心在鼠标位置。 接...

Global site tag (gtag.js) - Google Analytics