2016-09-06 1 views
3

J'ai implémenté une fonction GetSubImage afin d'extraire une partie d'une image. J'utilise SetROI, Copy, et ResetROI. Mais cela ne fonctionne pas lorsque les tâches parallèles utilisent la même image en raison de la SetROI n'est pas parallélisable. Tout autre moyen d'extraire une partie d'une image pouvant être exécutée simultanément?OpenCV: GetSubImage simultané pour extraire une partie d'une image

Répondre

1

Vous pouvez créer un en-tête de matrice temporaire qui pointe uniquement sur une partie de la matrice. Vous pouvez ensuite utiliser la fonction membre copyTo() sur cet en-tête. Exemple en C++:

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

De cette façon, ni les données ni l'en-tête de source sont affectés par l'opération, de sorte que vous pouvez exécuter simultanément.

+0

Merci. Mais j'utilise la bibliothèque OpenCvSharp et la classe CvMat n'a pas de constructeur thins ... –

+0

De quoi parlez-vous? C'est juste là: http://shimat.github.io/opencvsharp/html/bf9a14ed-6ebb-704b-2372-7e104ef77196.htm – ypnos

1

Enfin, pour extraire une partie d'une image, j'utilise cette fonction. Utilisé sur C# et avec le wrapper 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

Merci d'avoir pris le temps de poster la solution! C'est l'idée! Je ne peux que vous suggérer de passer à l'API moderne. Il a été introduit dans OpenCV 2.0 et il est déjà 3.1. – ypnos

+0

Quelle API? J'utilise ce https://github.com/shimat/opencvsharp et c'est très complet et parfait pour moi. –

+0

Oui OpenCVSharp est livré avec deux API. L'ancien OpenCV 1.x et le nouveau OpenCV 2.x, 3.x. Voir https://github.com/shimat/opencvsharp#usage Voyez-vous CvMat, IplImage? Non! Parce que c'est la nouvelle API qu'ils utilisent dans leur exemple. Mat == nouveau, CvMat == ancien. – ypnos