2016-10-06 10 views
1

Sagen, ich habe:Casting Matrix zwischen cv :: Mat zu Eigen :: Matrix und

Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> someMatrixEigen = someMatrix();

, wenn ich einen Lebenslauf :: Mat-Header (mit Typ CV_8U) zu schaffen war, sollte ich in der Lage sein, um das zu tun, oder?

cv::Mat someMatrixOCV(someMatrixEigen.rows(), someMatrixEigen.cols(), CV_8U, someMatrixEigen.data());

Dann, wenn ich cv::Mat anotherMatrixOCV, müssen Eigen zurück zu gehen, sollte dies auch funktionieren?

Eigen::Map<Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > anotherMatrixEigen(anotherMatrixOCV.ptr<int>(), anotherMatrixOCV.rows, anotherMatrixOCV.cols);

Sind die Integer-Typen hier kompatibel? Ich scheine das in der Lage zu bekommen, wenn ich float und CV_32F benutze, aber die Integer-Version scheint nicht zu funktionieren (segfault).

Antwort

0

CV_8U scheinen einen unsignierten Typ (insbesondere 8 Bits, z.B. unsigned char) zu sein, während Ihre Matrix eines signierten int Typen ist (wieviele Bits auf dem Compiler abhängt, aber mehr als 8). Sie können versuchen, CV_32S für die Konvertierung oder Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> zu verwenden.

+0

CV_8U ist kein Typ, sondern definiert '#define CV_8U 0'. ('opencv2/core/cvdef.h'). Für die Vorlage benötigen Sie einen tatsächlichen Typ, der in diesem Fall "unsigned char" ist. – user1906

+0

@ user1906 Danke. Ich habe deine Bearbeitung eingefügt. –

Verwandte Themen