gpt4 book ai didi

c - 通过数组用 C 编写的人脸检测器程序

转载 作者:行者123 更新时间:2023-11-30 16:10:28 27 4
gpt4 key购买 nike

所以我需要用C语言编写一个“人脸检测器”程序。基本上我需要输入“人脸检测”的数量、分辨率高度和宽度(最大120)以及“人脸”的坐标。然后输入是三个 h*w 数组,用作 RGB 值。

程序的输出应该与输入的 RGB 值相同,但用一个绿色矩形连接坐标(从而突出显示图片上的脸部),矩形中的 alpha 值为 255(其余为 alpha) =127)。

我遇到的问题是输出完全错误。第一个测试用例是一个带有错误坐标的 5x5 黑色正方形,效果很好。但其他测试用例是分辨率为 100x80 的实际图片。在这些情况下,图片周围不是绿色矩形,而是随机的绿色线条和点。 alpha 值同样是错误的,随机为 127 和随机为 255。我尝试重写代码多次,但每次结果都是相同的,只是 alpha 和 G 的随机值。

#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;
}

最佳答案

我认为您的逻辑没有任何问题,因此我会使用 yano 建议的测试用例逐步完成您的解决方案,看看您在读取内容时是否遇到问题。

当您将矩形的 G 值设置为 255 时,您确实犯了一个错误,即没有将 R 和 B 值设置为 0。

接下来我会做两件事:清理你的输入并简化你的循环。

为了清理您的输入,只需确保您的面数、高度和面数小于您的最大值。您收到的每个面部矩形的坐标都应小于 w 和 h,但大于 0。还要仔细检查您的面部矩形是否始终采用以下格式:[bottom-left x val,bottom-left y val,top -right x val, top-right y val] 就像您在进行所有这些计算时所假设的那样。如果这里存在输入问题,我猜测这最有可能导致隐藏问题。

您可以简化循环,以避免在为 Alpha 和绿色着色时接触矩形之外的任何内容。

对于绿色值,只需在两侧循环即可。像您正在做的那样循环遍历所有面 (n),但只需执行以下操作:

for (i = x1[n]; i <= x2[n]; ++i) { G[i][y1[n]] = 255; G[i][y2[n]] = 255; // Also set A to 255 as well as R and B to 0 here }
for (j = y1[n]; j <= y2[n]; ++j) { G[x1[n]][j] = 255; G[x2[n]][j] = 255; // Also set A to 255 as well as R and B to 0 here }

然后通过从x1[n] + 1循环到x2[n] - 1和y1[n] + 1到y2[n] - 1来覆盖矩形内的Alpha值。这不仅会使你的程序更快,但应该阻止任何错误的绿色或 alpha 值显示在给定点之外的任何位置。

修复这些问题后,当出现意外行为时,调试和查看错误所在应该会容易得多。

编辑:我错过了一个输入清理的案例。

关于c - 通过数组用 C 编写的人脸检测器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58883588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com