OpenCVのROI指定でハマる

OpenCV 2.x系のMatクラスでは、ROI(関心領域: Region of Interest)という概念がないらしい。画像のある特定の矩形領域を指定するには、矩形をしていして新たなMatオブジェクトを作るのが慣例となっている。

 

cv::Mat SrcImage(src_height, src_width, cv::CV_8UC3);
...
cv::Mat RoiImage = SrcImage(cv::Rect(roi_x, roi_y, roi_width, roi_height));

 

では、SrcImageがポインタ型にあったときはどうだろうか?

cv::Mat* pSrcImage = NULL;
pSrcImage = new Mat(src_height, src_width, cv::CV_8UC3);
...
cv::Mat RoiImage = *pSrcImage(cv::Rect(roi_x, roi_y, roi_width, roi_height));
cv::Mat RoiImage = (*pSrcImage)(cv::Rect(roi_x, roi_y, roi_width, roi_height));

 

間接演算子(*)は関数呼出しのカッコよりも優先度が低いので、pSrcImageを丸カッコでくくらないといけない。このくくりがないと、「呼び出しのかっこの前の式は、関数型 (または pointer-to-function 型) である必要があります」とコンパイラに怒られてしまいます...