Marko Zaninovic Ответов: 1

Помощь с программой распознавания лиц на языке Си


Мне нужно сделать программу "распознавания лиц" на языке Си. Входными данными являются количество обнаруженных "граней", высота и ширина изображения (не более 120), а затем координаты лица. После этого следующие входные данные представляют собой три массива, которые представляют значения RGB изображения.

Выводом программы должна быть исходная картинка, но с координатами, соединяющимися в виде зеленого прямоугольника. Альфа - значение в прямоугольнике должно быть 255, а снаружи-127.

Мы получаем несколько тестовых случаев для работы. Первый тестовый случай-это простой черный квадрат 5x5 со случайными координатами, выход для этого тестового случая в порядке.

Проблема возникает в остальных 3 тестовых случаях, которые являются реальными картинками. Что происходит, вместо зеленого прямоугольника, есть случайные зеленые линии и точки по всему изображению (даже не на координатах). И Альфа-значения, по-видимому, тоже радом, где несколько строк-Альфа 127, а несколько 255.

Edit: я определенно сформулировал все неправильно. Программа должна нарисовать зеленый прямоугольник и изменить Альфа - значения вокруг координат во входных данных. Сама программа не идентифицирует лицо.

#include <stdio.h>
#define MAX 120

int main() {
	FILE* fin = fopen("input.txt", "r");
	FILE* fout = fopen("output.txt", "w");

	int R[MAX][MAX], G[MAX][MAX], B[MAX][MAX], x1[MAX], y1[MAX], x2[MAX], y2[MAX], A[MAX][MAX];
	int h, w, n, i, j, k;

	fscanf(fin, "%d %d %d", &n, &h, &w);

	for (i = 0; i < n; i++) {
		fscanf(fin, "%d %d %d %d", &x1[i], &y1[i], &x2[i], &y2[i]);
	}

	for (i = 0; i < w; i++) {
		for (j = 0; j < h; j++) {
			fscanf(fin, "%d ", &R[i][j]);
		}
	}
	for (i = 0; i < w; i++) {
		for (j = 0; j < h; j++) {
			fscanf(fin, "%d ", &G[i][j]);
		}
	}
	for (i = 0; i < w; i++) {
		for (j = 0; j < h; j++) {
			fscanf(fin, "%d ", &B[i][j]);
		}
	}
	for (i = 0; i < w; i++) {
		for (j = 0; j < h; j++) {
			A[i][j] = 127;
		}
	}
	for (k = 0; k < n; k++) {
		for (i = x1[k]; i <= x2[k]; ++i) {
			G[i][y1[k]] = 255; 
			G[i][y2[k]] = 255;  
			A[i][y1[k]] = 255;
			A[i][y2[k]] = 255;
			R[i][y1[k]] = 0;
			R[i][y2[k]] = 0;
			B[i][y1[k]] = 0;
			B[i][y2[k]] = 0;
		}
		for (j = y1[k]; j <= y2[k]; ++j) {
			G[x1[k]][j] = 255;
			G[x2[k]][j] = 255; 
			A[x1[k]][j] = 255;
			A[x2[k]][j] = 255;
			R[x1[k]][j] = 0;
			R[x2[k]][j] = 0;
			B[x1[k]][j] = 0;
			B[x2[k]][j] = 0;
		}
	}
	for (k = 0; k < n; k++) {
		for (i = x1[k] + 1; i <= x2[k] - 1; i++) {
			for (j = y1[k] + 1; j <= y2[k] - 1; j++) {
				A[i][j] = 255;
			}
		}
	}
	fprintf(fout, "/image %d %d RGBA\n", h, w);
	for (i = 0; i < w; i++) {
		for (j = 0; j < h; j++) {
			fprintf(fout, "%d %d %d %d ", R[i][j], G[i][j], B[i][j], A[i][j]);
		}
	}

	return 0;
}


Что я уже пробовал:

Входные данные программы считываются правильно, так как я пробовал их распечатать, и они выходят нормально. Поэтому я попытался переписать циклы for несколькими различными способами, но независимо от того, какие пареметры я установил, результат получается один и тот же.

1 Ответов

Рейтинг:
0

RickZeeland

Может быть, вы можете извлечь уроки из этого примера: GitHub - lincolnhard/face-detection-C: распознавание лиц с использованием классического метода Виолы-Джонса[^]


Marko Zaninovic

Я попытался просмотреть файлы, но так как я новичок (едва начатые функции) Мне трудно понять большую часть кода :/

RickZeeland

Я заметил, что в этом примере используется библиотека OpenCV, но вы, возможно, не знакомы с ней?

RickZeeland

Кроме того, я думаю, что распознавание лиц-это не очень хороший проект для начинающих, так как он очень сложен ...

Marko Zaninovic

Я, вероятно, сформулировал это неправильно, цель программы состоит в том, чтобы просто сделать зеленый прямоугольник и изменить Альфа - значение вокруг координат из входных данных. То есть мы уже получили две координаты, которые нам нужны.