2 Stimmen

OpenCV-Bildfeld, 4D-Matrix

Ich versuche, eine IPL_DEPTH_8U , 3-Kanal-Bild in ein Array, so dass ich 100 Bilder im Speicher ablegen kann.

Um mein 4D-Array zu initialisieren, habe ich den folgenden Code verwendet (rows,cols,channel,stored):

int size[] = { 324, 576, 3, 100 };
CvMatND* cvImageBucket; = cvCreateMatND(3, size, CV_8U);

Ich habe dann eine Matrix erstellt und das Bild in die Matrix umgewandelt

CvMat *matImage = cvCreateMat(Image->height,Image->width,CV_8UC3 );
cvConvert(Image, matImage );

Wie würde ich / Zugriff auf die CvMatND, um die CvMat in sie an der Position der gespeicherten kopieren?

z.B.. cvImageBucket(:,:,:,0) = matImage; // copied first image into array

2voto

Chris Punkte 7802

Sie haben dies sowohl als C als auch als C++ getaggt. Wenn Sie in C++ arbeiten wollen, können Sie das (meiner Meinung nach) einfachere cv::Mat-Struktur um jedes der Bilder zu speichern, und verwenden Sie diese dann, um eine Vektor mit allen Bildern.

Zum Beispiel:

std::vector<cv::Mat> imageVector;
cv::Mat newImage;

newImage = getImage();       // where getImage() returns the next image,
                             // or an empty cv::Mat() if there are no more images
while (!newImage.empty())
{
    // Add image to vector
    imageVector.push_back(image);

    // get next image
    newImage = getImage();
}

0voto

Smash Punkte 3622

Ich vermute etwas Ähnliches wie:

für das i-te matImage

memcpy((char*)cvImageBucket->data+i*size[0]*size[1]*size[2],(char*)matImage->data,size[0]*size[1]*size[2]);

0voto

smttsp Punkte 3761

Ich stimme zwar mit @Chris dass es am besten ist, die vector<Mat> und nicht eine 4D matrix Diese Antwort ist nur als Referenz für diejenigen gedacht, die wirklich die 4D Matrizen in OpenCV (auch wenn es sich um eine nicht unterstützte, undokumentierte und unerforschte Sache handelt, von der nur wenig online verfügbar ist und von der behauptet wird, dass sie gut funktioniert).

Nehmen wir also an, Sie haben eine vector<Mat> vec con 2D o 3D Daten, die sich CV_8U , CV_32F usw.

Eine Möglichkeit, eine 4D-Matrix zu erstellen, ist

vector<int> dims = {(int)vec.size(), vec[0].rows, vec[0].cols};
Mat m(dims, vec[0].type(), &vec[0]);

Diese Methode schlägt jedoch fehl, wenn der Vektor nicht kontinuierlich ist, was typischerweise bei großen Matrizen der Fall ist. Wenn Sie dies für eine diskontinuierliche Matrix tun, erhalten Sie eine segmentation fault o bad access error wenn Sie die Matrix verwenden möchten (z. B. beim Kopieren, Klonen usw.). Um dieses Problem zu lösen, können Sie die Matrizen des Vektors wie folgt einzeln in die 4D-Matrix kopieren:

Mat m2(dims, vec[0].type());
for (auto i = 0; i < vec.size(); i++){
    vec[i].copyTo(temp.at<Mat>(i));
}

Beachten Sie, dass bei beiden Methoden die Matrizen die gleiche Auflösung haben müssen. Andernfalls können Sie unerwünschte Ergebnisse oder Fehler erhalten.

Beachten Sie auch, dass Sie immer die Option for loops aber es ist im Allgemeinen keine gute Idee, sie zu verwenden, wenn man vectorize .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X