这一阵做了冷板凳。蛋有淡淡的忧伤。开始吓唬闹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的强大功能,也为实际应用如无障碍技术、游戏交互等提供了一种创新的输入方式。通过学习...
本项目利用VC++编程语言和OpenCV(Open Source Computer Vision Library)库实现了手势识别以控制鼠标的移动及鼠标左键、右键的点击操作。以下将详细讲解这一技术的核心知识点。 首先,OpenCV是一个强大的计算机...
指尖移动来操控鼠标移动:通过手指的相对移动与移动的速度来操纵鼠标的移动 手势操控实现鼠标点击功能:通过指尖的特定动作实现鼠标的点击 手势操控实现滚动页面:通过特定的手势实现页面的滚动 键盘操作 指尖操控...
QT图像打开工具是一种基于QT框架并利用OpenCV库来实现图像查看和处理的应用程序。QT是一个流行的开源跨平台应用程序开发框架,广泛应用于GUI(图形用户界面)设计,而OpenCV则是一个强大的计算机视觉库,提供了丰富...
在MFC中,这通常通过CFileDialog类来实现,用户可以通过对话框选择图像文件,然后使用OpenCV的imread函数读取图像到内存中。 接着,"鼠标在图像上移动进行选择感兴趣区域"是通过响应鼠标消息来完成的。MFC提供了...
2. **处理鼠标消息:** 你需要捕获鼠标消息,如`WM_LBUTTONDOWN`(左键按下)、`WM_MOUSEMOVE`(鼠标移动)和`WM_LBUTTONUP`(左键释放)。当用户点击并拖动鼠标时,根据鼠标的位置计算出缩放和平移的参数。 3. **...
OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉工具,被广泛应用于图像分析、机器学习、深度学习等领域。GUI(图形用户界面)特性是OpenCV中的一个重要组成部分,它使得开发者可以创建交互式的可视化...
3. **画线**:在鼠标移动时,我们可以使用`cv2.line()`函数在图像上绘制线段。该函数需要四个参数:目标图像、起点、终点、线条颜色和线条宽度。 4. **计算长度**:利用欧几里得距离公式,我们可以轻松地计算出两点...
例如,使用TrackBar控件来控制旋转角度,使用两个Button控件分别进行平移和缩放操作。然后在事件处理程序中,应用Transformations到Graphics对象上: ```csharp private void buttonTranslate_Click(object sender,...
虚拟鼠标控制:使用食指在屏幕前移动,可控制电脑鼠标移动 虚拟键盘控制:当食指在虚拟键盘前滑过时,对应键帽会进行显示,当食指指尖与中指指尖进行并拢时可触发键盘点击操作 账号:ADMIN 密码:123 手势控制音乐...
在本项目"Python-OpenCV-Paint"中,开发者创建了一个使用Tkinter和OpenCV库的简单网络摄像头绘画程序。这个程序允许用户通过摄像头捕捉实时画面,并在其上进行绘画操作,实现了增强现实(Augmented Reality)的效果...
要在摄像头预览图像上绘制可移动的矩形框,需要利用Graphics类进行图形绘制,并设置鼠标事件处理器,如MouseDown、MouseMove和MouseUp,来捕捉用户的拖动操作,实时更新矩形框的位置。 6. **图像截取与保存**: ...
3. **视频播放**:在OpenCV中,`VideoCapture`对象用于打开和读取视频文件。通过循环调用`read`函数,可以逐帧获取视频数据,然后使用`imshow`显示每一帧图像。同时,可以设置定时器来控制播放速度。 4. **鼠标事件...
这一系统的核心在于通过识别特定的手势来控制鼠标操作,如移动、点击(单击和双击)、右键菜单等,进一步实现文件管理功能,如打开文件夹、移动文件和删除文件。 首先,项目涉及到的关键技术之一是动态手势识别。...
例如,`mouseMoveEvent`用于处理鼠标移动,`mousePressEvent`和`mouseReleaseEvent`用于识别拖动开始和结束,`resizeEvent`则处理窗口大小改变的事件。 总结起来,qt_camera.rar项目是一个综合运用了Qt5、C++和...
用户可以定义自己的热键(快捷键)来执行预设的命令或脚本,比如用一个简单的组合键打开经常使用的应用程序、快速复制粘贴文本,甚至可以创建复杂的宏命令来完成一系列连续操作。 **2. 脚本语言:** AHK_L提供了一...
VB提供`OpenFile`、`CloseFile`等函数进行文件的打开和关闭,同时需要了解多媒体文件格式(如MP3、WAV、MP4、WMV等)以便正确读取和播放。 6. **状态管理**:播放器需要跟踪和管理播放状态,如播放/暂停/停止、音量...
在这款软件中,开发者可能利用了`pyautogui`库来跟踪和记录鼠标的移动和点击,`pygame`或`vlc`库来处理音频录制,以及`opencv`或`PIL`库来捕捉和处理屏幕图像。 录屏功能是软件的核心,通常通过连续抓取屏幕图像并...
`zoomIn`和`zoomOut`方法则实际执行放大和缩小的操作,它们可能通过修改`QGraphicsView`的`scale`属性来实现,如`m_view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);`确保缩放中心在鼠标位置。 接...