OpenCV:并发GetSubImage以提取图像的一部分
Posted
技术标签:
【中文标题】OpenCV:并发GetSubImage以提取图像的一部分【英文标题】:OpenCV: Concurrent GetSubImage to extract a portion of an image 【发布时间】:2016-09-06 10:39:09 【问题描述】:我实现了一个GetSubImage
函数来提取图像的一部分。我使用SetROI
、Copy
和ResetROI
。但是当并行任务使用相同的图像时这不起作用,因为SetROI
不可并行。
还有其他方法可以提取可以并发运行的图像部分吗?
【问题讨论】:
【参考方案1】:您可以创建一个仅指向部分矩阵的临时矩阵标题。然后您可以在该标头上使用copyTo()
成员函数。 C++ 示例:
Mat GetSubImage(const Mat& source, const Rect ®ion)
Mat dest;
Mat roi(source, region);
roi.copyTo(dest);
return dest;
这样source
的数据和头部都不受操作的影响,可以并发执行。
【讨论】:
谢谢。但我使用的是 OpenCvSharp 库,而 CvMat 类没有瘦构造函数... 你在说什么?它就在那里:shimat.github.io/opencvsharp/html/…【参考方案2】:最后,为了提取图像的一部分,我使用了这个函数。用于 C# 和 OpenCVSharp 包装器:
static public IplImage GetSubImage(IplImage ipl, CvRect r)
CvMat submat;
CvMat mat = ipl.GetSubRect(out submat, r);
IplImage i = new IplImage(r.Width, r.Height, ipl.Depth, ipl.NChannels);
Cv.Copy(mat, i);
mat.Dispose();
submat.Dispose();
return i;
【讨论】:
感谢您抽出宝贵时间发布解决方案!就是那种精神!不过,我只能建议您切换到现代 API。它是在 OpenCV 2.0 中引入的,现在已经是 3.1。 哪个 API?我正在使用这个github.com/shimat/opencvsharp,它对我来说非常完整和完美。 是的,OpenCVSharp 带有两个 API。旧的 OpenCV 1.x 和新的 OpenCV 2.x、3.x 之一。见 github.com/shimat/opencvsharp#usage 你在那里看到 CvMat、IplImage 吗?不!因为这是他们在示例中使用的新 API。 Mat == 新的,CvMat == 旧的。 好的,太好了!这里使用 2.4 版本。我去看看 3.x 版本,但是当你有全世界的软件时,更新库和 api 并不容易。 新的 API 已经是 2.4 的一部分。你只需要停止使用 cvMat 并开始使用 Mat..以上是关于OpenCV:并发GetSubImage以提取图像的一部分的主要内容,如果未能解决你的问题,请参考以下文章
monkeyrunner对比屏幕局部图像.getSubImage()