it-swarm.com.de

Konvertierung von cv :: Mat in IplImage *

Die Dokumentation dazu scheint unglaublich fleckig zu sein. 

Ich habe im Grunde ein leeres Array von IplImage * s (IplImage ** imageArray) und rufe eine Funktion auf, um ein Array von cv :: Mats zu importieren kann es in das Array kopieren.

Momentan versuche ich das:

while(loop over cv::Mat array)
{
    IplImage* xyz = &(IplImage(array[i]));
    cvCopy(iplimagearray[i], xyz);
}

Was einen segfault erzeugt.

Auch versuchen:

while(loop over cv::Mat array)
{
    IplImage* xyz;
    xyz = &array[i];
    cvCopy(iplimagearray[i], xyz);
}

Was gibt mir einen Fehler beim Kompilieren von: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

Bleibt fest, wie ich weiter gehen kann und würde mich über Ratschläge freuen :)

47
amr

cv::Mat ist der neue Typ, der in OpenCV2.X eingeführt wird, während IplImage* die "alte" Bildstruktur ist. 

Obwohl cv::Mat die Verwendung von IplImage in den Konstruktorparametern unterstützt, bietet die Standardbibliothek keine Funktion für die andere Möglichkeit. Sie müssen die Bildheaderinformationen manuell extrahieren. (Denken Sie daran, dass Sie die IplImage-Struktur zuordnen müssen, was in Ihrem Beispiel fehlt).

22
YeenFei
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);

Ich denke, das wird die Arbeit machen.

Edit: Wenn Sie Kompilierungsfehler haben, versuchen Sie es folgendermaßen:

cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
18
William
 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

sie arbeiten mit new als ursprünglich deklariertes IplImage *.

11
user2103629

Ich persönlich denke, es ist nicht das Problem, das durch das Type Casting verursacht wird, sondern ein Pufferüberlaufproblem. es ist diese Linie 

cvCopy(iplimagearray[i], xyz);   

ich glaube, dass dies zu Segmentfehlern führen wird. Ich empfehle Ihnen zu bestätigen, dass das Array iplimagearray [i] genügend Puffergröße hat, um kopierte Daten zu erhalten

1
octavian

Laut OpenCV Spickzettel kann dies wie folgt erfolgen:

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);

Die Funktion cv :: cvarrToMat kümmert sich um die Konvertierungsprobleme.

0
chayan

Ein Problem könnte sein: Wenn Sie einen externen ipl verwenden und HAVE_IPL in Ihrem Projekt definieren, wird der ctor 

_IplImage::_IplImage(const cv::Mat& m)
{
    CV_Assert( m.dims <= 2 );
    cvInitImageHeader(this, m.size(), cvIplDepth(m.flags), m.channels());
    cvSetData(this, m.data, (int)m.step[0]);
}

gefunden in ../OpenCV/modules/core/src/matrix.cpp wird nicht verwendet/instanciated und die Konvertierung schlägt fehl.

Sie können es auf ähnliche Weise erneut implementieren:

IplImage& FromMat(IplImage& img, const cv::Mat& m)
{
    CV_Assert(m.dims <= 2);
    cvInitImageHeader(&img, m.size(), cvIplDepth(m.flags), m.channels());
    cvSetData(&img, m.data, (int)m.step[0]);
    return img;
}

IplImage img;
FromMat(img,myMat);
0
Timm

Bei grauem Bild verwende ich diese Funktion und es funktioniert gut! Sie müssen sich jedoch um die Funktionsmerkmale kümmern;)

CvMat * src=  cvCreateMat(300,300,CV_32FC1);      
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3);

cvConvertScale(src, dist, 1, 0);
0
ksolid