为什么 uchar* 指向垫子的指针变为空?
why uchar* pointer to a mat become null?
为什么在下面的代码中指向 EVectors
和 EValues
的指针无论是在 main 函数还是在 MYLDA
函数中都变为空?以及如何解决?
void main()
{
// some code
Mat EVectors;
Mat EValues;
uchar* pEVectors = EVectors.data;
uchar* pEValues = EValues.data;
MYLDA(train_labels, train_data, pEVectors, pEValues);
// some code
}
void MYLDA(vector<int> gnd, Mat_<float> _data, uchar* eigvector, uchar* eigvalue)
{
// some code
GeneralizedEigenSolver<MatrixXf> ges;
ges.compute(DPrime, WPrime);
MatrixXcf eigenvectorsInEigen = ges.eigenvectors();
VectorXcf eigenvaluesInEigen = ges.eigenvalues();
Mat eigenvectorsOpenCV(eigenvectorsInEigen.rows(),
eigenvectorsInEigen.cols(), CV_32FC1, eigenvectorsInEigen.data());
eigvector = eigenvectorsOpenCV;
Mat eigenvaluesOpenCV(eigenvaluesInEigen.rows(),
eigenvaluesInEigen.cols(), CV_32FC1, eigenvaluesInEigen.data());
eigvalue = eigenvaluesOpenCV;
}
解决此问题的一种方法是:
void main()
{
// some code
Mat EVectors;
Mat EValues;
MYLDA(train_labels, train_data, &EVectors, &EValues);
// some code
}
void MYLDA(vector<int> gnd, Mat_<float> _data, Mat* eigvector, MAt* eigvalue)
{
// some code
*eigvector = eigenvectorsOpenCV;
*eigvalue = eigenvaluesOpenCV;
}
为什么在下面的代码中指向 EVectors
和 EValues
的指针无论是在 main 函数还是在 MYLDA
函数中都变为空?以及如何解决?
void main()
{
// some code
Mat EVectors;
Mat EValues;
uchar* pEVectors = EVectors.data;
uchar* pEValues = EValues.data;
MYLDA(train_labels, train_data, pEVectors, pEValues);
// some code
}
void MYLDA(vector<int> gnd, Mat_<float> _data, uchar* eigvector, uchar* eigvalue)
{
// some code
GeneralizedEigenSolver<MatrixXf> ges;
ges.compute(DPrime, WPrime);
MatrixXcf eigenvectorsInEigen = ges.eigenvectors();
VectorXcf eigenvaluesInEigen = ges.eigenvalues();
Mat eigenvectorsOpenCV(eigenvectorsInEigen.rows(),
eigenvectorsInEigen.cols(), CV_32FC1, eigenvectorsInEigen.data());
eigvector = eigenvectorsOpenCV;
Mat eigenvaluesOpenCV(eigenvaluesInEigen.rows(),
eigenvaluesInEigen.cols(), CV_32FC1, eigenvaluesInEigen.data());
eigvalue = eigenvaluesOpenCV;
}
解决此问题的一种方法是:
void main()
{
// some code
Mat EVectors;
Mat EValues;
MYLDA(train_labels, train_data, &EVectors, &EValues);
// some code
}
void MYLDA(vector<int> gnd, Mat_<float> _data, Mat* eigvector, MAt* eigvalue)
{
// some code
*eigvector = eigenvectorsOpenCV;
*eigvalue = eigenvaluesOpenCV;
}