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 :)
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).
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);
(you have cv::Mat old)
IplImage copy = old;
IplImage* new_image = ©
sie arbeiten mit new als ursprünglich deklariertes IplImage *.
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
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.
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);
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);