#c #opencv
#c #opencv
Вопрос:
Здравствуйте, я компилирую пакет, во время компиляции я столкнулся с некоторой проблемой из-за преобразования типов данных. После поиска я обнаружил несколько похожих проблем, но это мне не помогло. Я не очень силен в программировании на C . Ваша помощь будет высоко оценена. Код составляет более 3 сотен строк, но я опубликую только ту часть, в которой произошла ошибка. Ошибка:
aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp: In member function ‘int CVG::Matrix::pseudoinverse(CVG::Matrix*)’:
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:279:13: error: base operand of ‘->’ has non-pointer type ‘cv::Mat’
sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
^~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:32: error: ‘CV_SVD’ was not declared in this scope
cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
^~~~~~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:32: note: suggested alternative: ‘CV_SSE’
cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
^~~~~~
CV_SSE
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:5: error: ‘cvInvert’ was not declared in this scope
cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
^~~~~~~~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:288:32: error: base operand of ‘->’ has non-pointer type ‘cv::Mat’
Matrix::setValueData(pinvAux->data.fl[(fila-1)*numColumnas columna-1],fila,columna);
^~
aerostack_stack/stack/libraries/lib_cvgutils/CMakeFiles/lib_cvgutils.dir/build.make:62: recipe for target 'aerostack_stack/stack/libraries/lib_cvgutils/CMakeFiles/lib_cvgutils.dir/src/source/matrixLib.cpp.o' failed
Часть кода, в которой это произошло, такова:
int Matrix::pseudoinverse(Matrix* matA)
{
//Comprobaciones previas
//To do
//Pinv calulation
cv::Mat pinvAux=cv::Mat(Matrix::numFilas,Matrix::numColumnas,CV_32FC1);
cv::Mat sourceAux=cv::Mat(Matrix::numFilas,Matrix::numColumnas,CV_32FC1);
for(int fila=1;fila<=numFilas;fila )
{
for(int columna=1;columna<=numColumnas;columna )
{
//printf("%fn",sourceAux->data.fl[1]);
sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
//printf("%fn",sourceAux->data.fl[(fila-1)*numColumnas columna-1]);
}
}
cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
for(int fila=1;fila<=numFilas;fila )
{
for(int columna=1;columna<=numColumnas;columna )
{
Matrix::setValueData(pinvAux->data.fl[(fila-1)*numColumnas columna-1],fila,columna);
}
}
//End
return 1;
}
Не могли бы вы дать мне несколько советов, как справиться с этой проблемой преобразования типов данных, потому что тип sourceAux
данных is cv::Mat
while data
является указателем float*
.
Комментарии:
1. sourceAux.data[… -> вероятно, должно быть sourceAux.data[… потому что cv::Mat не является типом указателя (где cv::Mat * вместо этого будет типом указателя).
Ответ №1:
У вас есть оператор-член ( .
) и оператор-член-указатель ( ->
) в неправильном порядке. Итак, вместо:
sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
вы должны использовать:
sourceAux.data->fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
Потому sourceAux
что это объект (а не указатель), и, как вы уже сказали, его data
элемент является указателем. Вы также должны внести аналогичное изменение в setValueData
вызов, несколькими строками ниже.