2016-09-06 15 views
3

Я реализовал функцию GetSubImage, чтобы извлечь часть изображения. Я использую SetROI, Copy и ResetROI. Но это не работает, когда параллельные задачи используют одно и то же изображение из-за того, что SetROI не является параллелизуемым.OpenCV: Concurrent GetSubImage для извлечения части изображения

Любой другой способ извлечь часть изображения, которое может работать одновременно?

ответ

1

Вы можете создать заголовок временной матрицы, который указывает только на часть матрицы. Затем вы можете использовать функцию-член copyTo() в этом заголовке. Пример в C++:

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

Таким образом, ни данных, ни заголовок source зависят от операции, так что вы можете выполнять его одновременно.

+0

Спасибо. Но я использую библиотеку OpenCvSharp, а класс CvMat не имеет thins constructor ... –

+0

О чем вы говорите? Он находится прямо здесь: http://shimat.github.io/opencvsharp/html/bf9a14ed-6ebb-704b-2372-7e104ef77196.htm – ypnos

1

Наконец, чтобы извлечь часть изображения, я использую эту функцию. Используется на C# и с wraper 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; 
    } 
+0

Благодарим вас за то, что нашли время и разместили решение! Это дух! Я могу только предложить вам перейти на современный API. Он был представлен в OpenCV 2.0, и теперь уже 3,1. – ypnos

+0

Какой API? Я использую этот https://github.com/shimat/opencvsharp, и это очень полно и идеально подходит для меня. –

+0

Да OpenCVSharp поставляется с двумя API. Старый OpenCV 1.x и новый OpenCV 2.x, 3.x. См. Https://github.com/shimat/opencvsharp#usage. Вы видите там CvMat, IplImage? Нет! Потому что это новый API, который они используют в своем примере. Mat == new, CvMat == old. – ypnos