使用OpenCV C++,获取cv::Mat中感兴趣区域(ROI)的方法

22

我刚开始使用OpenCV(两天前开始),现在正试图从Kinect获取的深度图像中剪切出手部图像,以用于手势识别。我的图片是cv::Mat类型。我的问题如下:

  1. 是否有一种方法可以将cv::Mat转换为cvMat,以便我可以使用cvGetSubRect方法来获取兴趣区域呢?
  2. cv::Mat中是否有可用于获取图像部分的方法?

我想使用IplImage,但我在某个地方读到cv::Mat现在是首选的方式。

2个回答

47

你可以在 cv::Mat 上使用重载的函数调用运算符:

cv::Mat img = ...;
cv::Mat subImg = img(cv::Range(0, 100), cv::Range(0, 100));

查看OpenCV文档获取更多信息并了解重载函数,其中使用cv::Rect。请注意,使用此形式的切片会创建一个新的矩阵头,但不会复制数据。


2
谢谢你的回答!我尝试了Range,但它给了我一个运行时错误,但cv::Rect()却完美地工作了! - vprasad
你能否编辑你的问题,附上出现错误的 cv::Range 代码?如果我的回答有帮助,请点击接受答案。 - Michael Koval
3
简历:Range给了我运行时错误,但cv::Rect却非常好用!谢谢! - Froyo
是的,它似乎在使用Rect。请查看http://jayrambhia.wordpress.com/2012/09/20/roi-bounding-box-selection-of-mat-images-in-opencv/以获取示例。 - Fanglin

23

也许另一种方法是:

//Create the rectangle
cv::Rect roi(10, 20, 100, 50);
//Create the cv::Mat with the ROI you need, where "image" is the cv::Mat you want to extract the ROI from
cv::Mat image_roi = image(roi)

我希望这可以帮到你。


1
Rect_(x, y, w, h)表示矩形的左上角坐标为(x, y),宽度和高度分别为w和h。 - haofeng
这适用于16位数据吗? - Kai Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接