OpenCV:并发GetSubImage以提取图像的一部分

Posted

技术标签:

【中文标题】OpenCV:并发GetSubImage以提取图像的一部分【英文标题】:OpenCV: Concurrent GetSubImage to extract a portion of an image 【发布时间】:2016-09-06 10:39:09 【问题描述】:

我实现了一个GetSubImage 函数来提取图像的一部分。我使用SetROICopyResetROI。但是当并行任务使用相同的图像时这不起作用,因为SetROI 不可并行。

还有其他方法可以提取可以并发运行的图像部分吗?

【问题讨论】:

【参考方案1】:

您可以创建一个仅指向部分矩阵的临时矩阵标题。然后您可以在该标头上使用copyTo() 成员函数。 C++ 示例:

Mat GetSubImage(const Mat& source, const Rect &region)

    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以提取图像的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中提取此图像的一部分? [关闭]

monkeyrunner对比屏幕局部图像.getSubImage()

如何使用 OpenCV 从图像中提取文本行

请问大虾们,opencv如何只对图像选择区域提取特征点

OpenCV图像拼接 原理介绍 C++ OpenCV 案例实现

如何使用Opencv对图像进行颜色特征提取