我想在C++中使用C++/CLI中的OpenCV 3編寫一個薄包裝(實際上我需要的功能非常少)。在不使用新的情況下將原生數據存儲在C++/cli中
但是我不是很清楚如何我可以將我的Mat變量存儲在託管類中,如果我嘗試這樣做,因爲我得到,如預期的那樣,錯誤指出我不能混合本機和非本地成員。
從我收集我應該新的我的本地成員和存儲一個指針,但我不能這樣做在所有情況下,因爲許多OpenCV方法返回一個墊,而不是一個指針墊。
經過一些測試,我看到: - 如果我存儲一個指向新的Mat();這工作得很好,它將在 後面仍然可用 - 如果我嘗試存儲指向Mat的指針(由imread返回),它將在方法結束後損壞。
什麼是正確的方式來存儲墊或指針?
示例代碼:
public ref class Matrix
{
private:
Mat* mat;
msclr::interop::marshal_context marshalcontext;
public:
static Matrix^ FromFile(System::String^ FileName)
{
Matrix^ ret = gcnew Matrix();
msclr::interop::marshal_context context;
std::string StdFileName = context.marshal_as<std::string>(FileName);
Mat tmpmat = imread(StdFileName);
Mat * tmpmatptr = new Mat(50, 50, 1); // Works in all cases
//Mat * tmpmatptr = &tmpmat; // will NOT work out of the scope of this method
Console::WriteLine(tmpmat.cols); // Always works
Console::WriteLine(tmpmat.rows); // Always works
Console::WriteLine(tmpmatptr->cols); // Always works
Console::WriteLine(tmpmatptr->rows); // Always works
ret->mat = tmpmatptr;
return ret;
}
void Save(System::String^ FileName)
{
std::string StdFileName = marshalcontext.marshal_as<std::string>(FileName);
// Code bellow works if tmpmatptr in previous method was assigned a new Mat, doesn't work if it was assigned a pointer to imread result
Console::WriteLine(mat->rows);
Console::WriteLine(mat->cols);
imwrite(StdFileName, *mat);
}
};
注:我不是在尋找替代品寫我自己的包裝,沒有那些我已經試過的滿意。
這是一個標準的[懸擺指針錯誤(https://en.wikipedia.org/維基/ Dangling_pointer)。使用ret-> mat = new Mat(tmpmat)創建存儲在堆上的副本。不要忘記Matrix中的析構函數和終結器,它需要再次摧毀它。 –