在 OpenCV 1.x/2.x C 接口中,cvGetSize 與 cvSize 都涉及圖像/矩陣尺寸,但語義截然不同。混淆二者會導致 ROI (Region of Interest) 設置錯誤、內存越界等問題。
| 函數/結構 | 性質 | 返回/構造內容 | 受 ROI 影響 |
|---|---|---|---|
CvSize cvSize(int w, int h) | 構造函數/宏 | 根據參數構造 {width, height} | 否 |
CvSize cvGetSize(const CvArr* arr) | 函數 | 返回數組/圖像**當前有效區域**尺寸 | 是** |
typedef struct CvSize {
int width; // 寬度 (列數)
int height; // 高度 (行數)
} CvSize;
// 構造宏
inline CvSize cvSize(int width, int height);
IplImage* src = cvLoadImage("test.jpg"); // 假設 640x480
cvSetImageROI(src, cvRect(100, 100, 200, 150)); // 設置 ROI
CvSize sz1 = cvSize(src->width, src->height); // {640, 480} 整圖尺寸
CvSize sz2 = cvGetSize(src); // {200, 150} **ROI 尺寸**
IplImage* dst1 = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1); // 全圖大小
IplImage* dst2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); // ROI 大小
cvGetSize(src);若需**全圖尺寸**忽略 ROI,用 cvSize(src->width, src->height);cvResetImageROI(src) 後 cvGetSize 回傳全圖尺寸;cvGetSize 也適用於 CvMat*,返回有效行列數;cv::Mat,尺寸獲取為 mat.size() (返回 cv::Size),ROI 為 mat(cv::Rect) 子矩陣,語義更清晰。cvSize 是「造」,cvGetSize 是「量」。
量時看 ROI,造時看參數。
搞清這一對,能避免 80% 的 OpenCV C 接口尺寸相關 Bug。