OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误
opencv C++ neural network predict() function throws "Bad argument" error
我已经设法训练了一个神经网络来识别图像中的数字,并将网络参数保存到.xml文件中。
然而,当针对新图像测试网络时,代码在predict()阶段失败,错误为:
OpenCV错误:CvANN_MLP::predict中的参数错误(输入和输出必须是相同类型的浮点矩阵,并且具有相同的行数),文件。。。。。。。。\opencv\modules\ml\src\ann_mlp.pp,第279行。
ann_mlp.pp第279行为:
if( !CV_IS_MAT(_inputs) || !CV_IS_MAT(_outputs) ||
!CV_ARE_TYPES_EQ(_inputs,_outputs) ||
(CV_MAT_TYPE(_inputs->type) != CV_32FC1 &&
CV_MAT_TYPE(_inputs->type) != CV_64FC1) ||
_inputs->rows != _outputs->rows )
CV_Error( CV_StsBadArg, "Both input and output must be floating-point matrices "
"of the same type and have the same number of rows" );
我已经通过运行以下代码检查了输入行:
cv::Size s = newVec.size();
int rows = s.height;
int cols = s.width;
cout << "newVec dimensions: " << rows << " x " << cols << endl;
并得出预期的1×900矢量/矩阵。
我已经根据错误对话框将输入和输出矩阵设置为CV_32FC1,如下所示:
输入矩阵
cv::Mat newVec(1, 900, CV_32FC1);
newVec = crop_img.reshape(0, 1); //reshape / unroll image to vector
CvMat n = newVec;
newVec = cv::Mat(&n);
输出矩阵
cv::Mat classOut = cvCreateMatHeader(1, CLASSES, CV_32FC1);
我试着运行这样的预测函数:
CvANN_MLP* nnetwork = new CvANN_MLP;
nnetwork->load("nnetwork.xml", "nnetwork");
int maxIndex = 0;
cv::Mat classOut = cvCreateMatHeader(1, CLASSES, CV_32FC1);
//prediction
nnetwork->predict(newVec, classOut);
float value;
float maxValue = classOut.at<float>(0, 0);
for (int index = 1; index<CLASSES; index++)
{
value = classOut.at<float>(0, index);
if (value>maxValue)
{
maxValue = value;
maxIndex = index;
}
}
有什么想法吗?非常感谢。。。
我怀疑问题出在您的输入上,而不是您的输出上。
首先,重要的是要明白,OpenCV应该为此受到很多指责,而不是你们。他们的C++API相当平庸,它给你造成了很大的混乱。
看,通常在C++中,当你定义一个1x900的浮点矩阵时,它保持的浮点矩阵。C++具有很强的类型安全性。
OpenCV没有。如果将一个字节矩阵分配给一个浮点矩阵,后者将更改其类型(!)。您的代码将newVec
初始化为这样一个浮点矩阵,然后分配第二个矩阵,然后再分配另一个矩阵。我怀疑crop_img
仍然是一个图像,即8位。重塑它将使其1x900,但不是浮点。这就是.convertTo
的工作。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- C++线程"Call to non-static member function without an object argument"
- 尝试在类中编译内核,出现错误"__init__() got an unexpected keyword argument 'kernel'"
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- LLVM:如何修复"Referring to an argument in another function"
- 如何修复此"argument of type incompatible with parameter"错误?
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- Constexpr lambda argument
- 通过"Value Template Argument"与常规阵列在堆栈中分配内存
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误