ich versuche, eine DLL mit dem OpenCV PCA enthalten, um es unter Labview nutzbar zu machen.Pass cv :: Mat zu labview
Ich habe die Funktion definiert:
extern "C" __declspec(dllexport) int __cdecl doPCA(float *input,int32_t input_rows,int32_t input_cols,double maxComponents,float *output);
und schrieb es mag:
int __cdecl doPCA(float *input,int32_t input_rows, int32_t input_cols,double maxComponents,float *output)
{
Mat pcaset = Mat(input_rows,input_cols, CV_32FC1, &input); //CV_32FC1 is for float valued pixel
PCA pca(pcaset, // pass the data
Mat(), // we do not have a pre-computed mean vector, // so let the PCA engine to compute it
CV_PCA_DATA_AS_ROW, // indicate that the vectors// are stored as matrix rows// (use PCA::DATA_AS_COL if the vectors are // the matrix columns)
2 // specify, how many principal components to retain
);
int i, j;
for(i = 0; i < input_rows; i++)
{
for(j = 0; j < input_cols; j++)
{
output[(i * input_cols) + j] = pca.eigenvectors.data[(i * input_cols) + j]; // Write Values to 1D output array
}
}
if(pca.eigenvectors.empty()){return 0;} // is empty
if(!pca.eigenvectors.empty()){return 1;} // is not empty
}
Auf Labview Seite greife ich auf die Funktion, die durch die kompilierte DLL:
Aber ich kann es nicht herausfinden, wie man den Wert vonübergibtcv::Mat
an das 1D-Float-Ausgangsarray.
int i, j;
for(i = 0; i < input_rows; i++)
{
for(j = 0; j < input_cols; j++)
{
output[(i * input_cols) + j] = pca.eigenvectors.data[(i * input_cols) + j]; // Write Values to 1D output array
}
}
Kann jemand einen Hinweis geben?
Werfen Sie einen Blick [hier] (http://docs.opencv.org/3.1.0/d1/dee/tutorial_introduction_to_pca.html#gsc.tab = 0) um zu wissen, wie man richtig auf die Eigenvektoren zugreift. Sie sind nur "n_of_principal_components x dimension" (und nicht "input_rows x input_cols"), und sie sind "double" – Miki