[英]Face detector program in C via arrays
所以我需要在C中制作一個“人臉檢測器”程序。 基本上我需要輸入“人臉檢測”的數量、分辨率高度和寬度(最大 120)以及“人臉”的坐標。 然后輸入是三個 h*w arrays 作為 RGB 值。
程序的 output 應該與輸入的 RGB 值相同,但有一個綠色矩形連接坐標(從而突出顯示圖片上的面部),矩形中的 alpha 值為 255(rest 為 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 值顯示在給定點之外的任何地方。
修復這些問題后,當您遇到意外行為時,應該更容易調試並查看錯誤在哪里。
編輯:我錯過了一個輸入衛生的案例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.