@artem_guy

Как правильно построить структуру программы?

Всем доброго времени суток! Решил заняться распознаванием жестов, обучил классификатор с помощью traicascade, опробовал его работу в простой программе,где ищет жест на картинке. Ввиду того,что выборка не очень большая, точность распознавания примерно процентов 50. Вот теперь главный вопрос, у меня будет много жестов, штук 5-7, и я хочу,чтобы программа могла подписать,какой жест она "увидела". Как это всё завязать? До меня пока как-то не доходит...
Пример программы прикрепляю.
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
	Mat image;
	image = imread("hand_gesture.jpg", CV_LOAD_IMAGE_COLOR);
	namedWindow("window1", 1);   imshow("window1", image);

	// Load hand cascade (.xml file)
	CascadeClassifier hand_cascade;
	hand_cascade.load("C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalcathand.xml"); 

	// Detect hands
	std::vector<Rect> hands;
	hand_cascade.detectMultiScale(image, hands, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

	// Draw circles on the detected hands
	for (int i = 0; i < hands.size(); i++)
	{
		Point center(hands[i].x + hands[i].width*0.5, hands[i].y + hands[i].height*0.5);
		ellipse(image, center, Size(hands[i].width*0.5, hands[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
	}

	imshow("Detected hand", image);

	waitKey(0);
	return 0;
}
  • Вопрос задан
  • 227 просмотров
Решения вопроса 1
Поиграйтесь с cv::rectangle, cv::addWeighted и cv::putText.
Вот код прямиком из рабочего проекта, рисует полупрозрачный прямоугольник и пишет строки текста:

cv::Mat writeOnImage(const cv::Mat& source, const std::vector<std::string>& lines, int width)
{
	auto rect = source.clone();
	cv::rectangle(rect, { 10, 10 }, { width, 20 + 50 * static_cast<int>(lines.size()) }, cv::Scalar(0, 0, 0), cv::FILLED);

	auto result = cv::Mat();
	cv::addWeighted(source, 0.6, rect, 0.4, 0.0, result);

	for (size_t i = 0; i < lines.size(); ++i) {
		cv::putText(result, lines[i], { 20, 50 + 50 * static_cast<int>(i) }, cv::FONT_HERSHEY_PLAIN, 3, cv::Scalar(10, 255, 255), 3, cv::LINE_8);
	}

	return result;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы