首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 人臉性別識別教程(9):MFC 框架顯示圖片與遍歷文件夾

     編輯:關於C++

功能概覽

在 MFC 對話框中實現:選擇圖片文件夾 → 自動遍歷該文件夾下所有圖片(jpg/bmp/png) → 在 Picture 控件中顯示 → 提供下一張按鈕切換。

關鍵步驟

  1. 添加「下一張」按鈕,ID 設為 IDC_BUTTON_NextImage。
  2. 編寫遍歷函數 GetNextBigImg():
    • 使用 readdir 讀取目錄項(需 dirent.h)。
    • 用 strstr 判斷擴展名(.jpg/.bmp/.png)。
    • 非圖片遞歸調用自身跳過(注意遞歸深度風險,建議改用循環)。
    • 圖片用 cvLoadImage 讀取,CvvImage::CopyOf + DrawToHDC 繪製到 Picture 控件的 DC 上。
  3. 初始化 Picture 控件:在 OnInitDialog 中獲取控件 DC (GetSafeHdc()) 與客戶區矩形 (GetClientRect),存入成員變量 m_pPicCtlHdc、m_PicCtlRect。
  4. 「下一張」按鈕響應:直接調用 GetNextBigImg()。

核心代碼片段

// 遍歷並顯示下一張圖片
void CGenderRecognitionMFCDlg::GetNextBigImg() {
    if (m_pDir && (m_pEnt = readdir(m_pDir)) != NULL) {
        char* jpg = strstr(m_pEnt->d_name, ".jpg");
        char* bmp = strstr(m_pEnt->d_name, ".bmp");
        char* png = strstr(m_pEnt->d_name, ".png");
        if (!jpg && !bmp && !png) { // 非圖片,遞歸跳過
            GetNextBigImg();
            return;
        }
        // 圖片:載入並繪製
        char fullPath[500];
        sprintf_s(fullPath, "%s%s", m_ImageDir, m_pEnt->d_name);
        IplImage* img = cvLoadImage(fullPath);
        CvvImage cvImg;
        cvImg.CopyOf(img);
        cvImg.DrawToHDC(m_pPicCtlHdc, m_PicCtlRect);
        cvReleaseImage(&img);
    }
}

遞歸風險提示

若文件夾包含大量非圖片文件,遞歸深度可能導致棧溢出。生產代碼應改用 while 循環輪詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved