Я немного новичок в opencv и могу использовать некоторую помощь. Я хочу обнаружить ASL ручные знаки.
Для обнаружения рук я могу использовать либо определение по цвету кожи, либо классификатор по волосам. Я уже обнаруживаю руки, но проблема заключается в определении формы руки.
Я могу получить форму текущей руки, используя алгоритм, описанный Вот, проблема в том, как мне сравнить эту форму с моей базой данных форм?
Я попытался сравнить их, используя алгоритм, описанный Вот, который обнаруживает похожие функции изображения. Проблема в том, что это будет соответствовать всем раздачам, так как … он распознает их как руки. Например, проверьте это изображение, оно должно указывать только на V, но оно также обнаруживает особенности в W и R.
Я хочу, чтобы мой конечный результат был похож Вот, так как я могу сравнить формы изображения? Мой подход неверен?
Я думал, что обнаружение по корпусу с выпуклостью не сработает, потому что большинство знаков — кулаки. Проверьте O, например, у него нет открытых пальцев, поэтому я подумал, что попытка сравнить контуры будет лучше. Как их сравнить? ФЛАНН, похоже, не работает. Или я делаю это неправильно.
Будет ли работать каскадный классификатор Хаара? Или он также обнаружит две руки в разных положениях как руки?
Или есть другой способ подбора формы? Это могло решить мою проблему, но я не смог найти ни одного примера, который бы подходил для пользовательских фигур, только для таких, как прямоугольники, круги и треугольники.
Обновить
Хорошо, я немного поиграл с matchShapes как berak сказал мне. Вот мой код ниже (он немного грязный, так как я сейчас тестирую).
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src; Mat src_gray;
int thresh = 10;
int max_thresh = 300;
/// Function header
void thresh_callback(int, void* );
/** @function main */
int main( int argc, char** argv )
{
/// Load source image and convert it to gray
src = imread( argv[1], 1 );
/// Convert image to gray and blur it
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(3,3) );
/// Create Window
char* source_window = "Source";
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );
thresh_callback( 0, 0 );
waitKey(0);
return(0);
}
/** @function thresh_callback */
void thresh_callback(int, void* )
{
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
double largest_area=0;
int largest_contour_index=0;
Rect bounding_rect;
/// Detect edges using canny
Canny( src_gray, canny_output, thresh, thresh*2, 3 );
/// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
cout<<contours.size()<<endl;
/// Draw contours
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
vector<vector<Point> >hull( contours.size() );
for( int i = 0; i< contours.size(); i++ )
{ Scalar color = Scalar( 255,255,255 );
convexHull( Mat(contours[i]), hull[i], false );
// imshow("conturul"+to_string(i), drawing );
double a=contourArea( hull[i],false); // Find the area of contour
if(a>largest_area){
largest_area=a;
largest_contour_index=i; //Store the index of largest contour
bounding_rect=boundingRect(hull[i]);}
}
cout<<"zaindex "<<largest_contour_index<<endl;
Scalar color = Scalar( 255,255,255 );
drawContours( drawing, hull, largest_contour_index, color, 2, 8, hierarchy, 0, Point() );
namedWindow( "maxim", CV_WINDOW_AUTOSIZE );
imshow( "maxim", drawing );
Mat rects=imread( "scene.png", 1 );
rectangle(rects, bounding_rect, Scalar(0,255,0),1, 8,0);
imshow( "maxim2", rects );
/// Show in a window
}
Проблема с этим — определение контура. Эти «контуры» руки на самом деле состоят из нескольких контуров, и изображение, которое я показал ранее, на самом деле состоит из этих нескольких контуров, но накладывается друг на друга. matchShapes принимает массивы точек в качестве параметров, но контуры являются массивами массивов точек.
Итак, мой вопрос, как я могу добавить свой вектор контуров к себе, чтобы я мог передать его в matchShapes? Другими словами, как я могу сделать один контур из нескольких перекрывающихся контуров?
Задача ещё не решена.