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
.