4

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

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

4

2 回答 2

2

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

Mat GetSubImage(const Mat& source, const Rect &region)
{
    Mat dest;
    Mat roi(source, region);
    roi.copyTo(dest);
    return dest;
}

这样,source操作的数据和表头都不会受到影响,因此可以并发执行。

于 2016-09-06T10:42:57.370 回答
1

最后,为了提取图像的一部分,我使用了这个函数。在 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;
    }
于 2016-09-07T14:37:34.263 回答