簡體   English   中英

C 中的人臉檢測程序通過 arrays

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM