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

《學習 OpenCV》練習題:第四章第三題 - 直方圖計算與互動式 ROI 選取

     編輯:關於C語言

本文實作 OpenCV 經典教材《學習 OpenCV》第四章第三題:載入影像、計算 RGB 三通道與灰階直方圖、繪製直方圖圖像、支援滑鼠框選矩形區域 (ROI) 並即時顯示該區域直方圖。

核心功能模組

  • 影像載入與通道分離:`cvLoadImage` → `cvSplit` 得到 R、G、B、Gray 四張單通道圖。
  • 直方圖計算:`cvCreateHist` (256 bins, 範圍 0-255) → `cvCalcHist` 統計像素分佈。
  • 直方圖繪製:`getHistImage` 函數將直方圖數據繪製為矩形條狀圖 (`cvRectangle`),支援自訂顏色。
  • 多視窗顯示:原圖、四通道直方圖並排顯示 (`cvShowImage`)。
  • 滑鼠回呼互動:`cvSetMouseCallback` 處理左鍵按下/移動/釋放,記錄矩形座標,在原圖繪製選取框 (`draw_rect`)。

關鍵代碼片段

IplImage* getHistImage(IplImage* src, CvHistogram* hist, CvSize size, CvScalar color) {
    IplImage* dst = cvCreateImage(size, IPL_DEPTH_8U, 3);
    cvSet(dst, cvScalarAll(255));
    float max_val; cvGetMinMaxHistValue(hist, NULL, &max_val);
    int bin_w = size.width / 256;
    for (int i = 0; i < 256; i++) {
        float val = cvGetReal1D(hist->bins, i);
        CvPoint p0 = cvPoint(i * bin_w, size.height);
        CvPoint p1 = cvPoint((i+1) * bin_w, size.height - cvRound(val * size.height / max_val));
        cvRectangle(dst, p0, p1, color, -1);
    }
    return dst;
}

void my_mouse_callback(int event, int x, int y, int flags, void* param) {
    // 記錄 rect = cvRect(x, y, 0, 0) 起始點
    // EVENT_MOUSEMOVE 更新寬高
    // EVENT_LBUTTONUP 完成選取,重新計算 ROI 直方圖並顯示
}

執行結果

直方圖與 ROI 選取示意圖

已知不足與改進方向

  • 選取框無即時回饋:滑鼠拖動時矩形框未在原圖即時繪製,需在 `EVENT_MOUSEMOVE` 中臨時複製圖像繪製框後 `cvShowImage`,釋放後再恢復原圖。
  • 可引入 `cvCopy` 複製影像進行臨時繪製,避免修改原圖數據。
  • 現代 OpenCV (C++ API) 建議使用 `cv::Mat`、`cv::calcHist`、`cv::rectangle`、`cv::imshow`,代碼更簡潔安全。

此練習涵蓋影像載入、通道操作、直方圖統計、GUI 互動等核心技能,是入門 OpenCV 影像分析的絕佳實戰。

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