我正在开展一个涉及手势识别的项目。我必须这样做 识别手势并识别它代表的字母表。我能够使用HSV色彩空间检测皮肤。我有一个视频 所有字母手势和所有字母手势的图像。现在我有 找到哪个手势代表哪个字母。我需要知道如何 比较每帧视频的手势与图像手势.I 我是opencv的新手,请有人帮助我。这是我的代码
#include <opencv2\opencv.hpp>
using namespace cv;
using std::cout;
/*--------------- SKIN SEGMENTATION ---------------*/
int main() {
VideoCapture cap("E:\\videotest.mp4");
if (!cap.isOpened())
{// check if we succeeded
printf("coundnotoepn");
return -1;
}
Mat3b frame;
while (cap.read(frame)){
/* THRESHOLD ON HSV*/
cvtColor(frame, frame, CV_BGR2HSV);
GaussianBlur(frame, frame, Size(7, 7), 1, 1);
medianBlur(frame, frame, 15);
for (int r = 0; r<frame.rows; ++r){
for (int c = 0; c<frame.cols; ++c)
// 0<H<0.25 - 0.15<S<0.9 - 0.2<V<0.95
if ((frame(r, c)[0]>5) && (frame(r, c)[0] < 17) && (frame(r, c)[1]>38) && (frame(r, c)[1]<250) && (frame(r, c)[2]>51) && (frame(r, c)[2]<242)); // do nothing
else for (int i = 0; i<3; ++i) frame(r, c)[i] = 0;
}
/* BGR CONVERSION AND THRESHOLD */
Mat1b frame_gray;
cvtColor(frame, frame, CV_HSV2BGR);
cvtColor(frame, frame_gray, CV_BGR2GRAY);
threshold(frame_gray, frame_gray, 60, 255, CV_THRESH_BINARY);
morphologyEx(frame_gray, frame_gray, CV_MOP_ERODE, Mat1b(3, 3, 1), Point(-1, -1), 3);
morphologyEx(frame_gray, frame_gray, CV_MOP_OPEN, Mat1b(7, 7, 1), Point(-1, -1), 1);
morphologyEx(frame_gray, frame_gray, CV_MOP_CLOSE, Mat1b(9, 9, 1), Point(-1, -1), 1);
medianBlur(frame_gray, frame_gray, 15);
// imshow("Threshold", frame_gray);
cvtColor(frame, frame, CV_BGR2HSV);
resize(frame, frame, Size(), 0.5, 0.5);
imshow("Video", frame);
Mat3b image;
image = imread("E:/hand.jpg", CV_LOAD_IMAGE_COLOR); // Read the file
if (!image.data) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl;
return -1;
}
cvtColor(image, image, CV_BGR2HSV);
//printf("%d", image(2, 3)[5]);
//resize(image,image, Size(), 0.5, 0.5);
namedWindow("Display window", WINDOW_AUTOSIZE);// Create a window for display.
imshow("Display window", image); // Show our image ins
waitkey(1);
}
答案 0 :(得分:0)
有几种方法可以解决这个问题,最广泛使用和显而易见的是跟踪每个单独的手指(或手的指向部分)并写出某些规则来分类每个手势(即两个手指指向外面的手的顶部可能是“和平”的象征或其他东西)
您可以通过跟踪凸包缺陷来实现此目的。 Here 是一个教程的链接,它将解释这个过程,它用Python编写,但我相信一旦你理解了它就可以将它移植到C ++逻辑。
然而,如果您已经拥有每个手势的图像,我建议使用神经网络进行分类,尝试并操纵您已有的图像,使它们与您尝试分类的图像相似(即进行皮肤检测和二值化图片)
Here 是教程的另一个链接,用于解释神经网络是什么,它们如何工作以及如何在C ++中实现图像识别网络。
我必须提到的是,每个像素可能会被用作网络的输入,因此要减轻它的负担(并使其更快地训练)我建议调整图像大小以使它们尽可能小(但你仍然可以做出手势)
希望这些信息有所帮助,祝你好运!
答案 1 :(得分:0)
&#34;我需要知道如何将每帧视频中的手势与图像手势进行比较。&#34; - 关键是要弄清楚什么样的相似度对你的应用有用。
没有一种通用的方式来比较图像,绝对不是视频序列(比图像更难的问题)。比较图像的一种流行方式是“地球移动距离”#34;关于颜色直方图;但这可能不会对你的情况起作用。您可以尝试使用不同手势训练的HoG识别器;或者(例如)图像之间的DCT系数的差异按比例缩小到像32x32这样的非常小的尺寸。模板匹配(OpenCV matchTemplate
)可能不会在这里工作,因为您想要将图像与类别(所有可能的相同类型的图像)进行比较,模板不会这样做。模板匹配k-最近邻分类和大示例库(每个类别几千)可能工作。
要识别手手势(带动作)而不是手形状(不动),最好的办法是阅读文献并实施已发布的算法。尝试Google学术搜索&#34; hand gesture recognition video&#34;。例如:
最后,这将是相当困难的;不要期望OpenCV能够以简单的方式完成任务。在OpenCV中有HoG,但你必须训练它,并进行广泛的调整。其他已发布的算法(如3D小波),您必须从头开始构建和/或将另一个库添加到OpenCV。祝你好运:)