c++ - 使用 copyTo 函数断言失败 (C++)

标签 c++ opencv image-processing assertions

和之前很多人一样,我有一个断言错误问题,我无法自己解决...这是我的代码片段:

void tuneParameters(cv::Ptr<cv::ml::KNearest>& classifier, cv::Mat& trainDataMat, cv::Mat& trainLabels, int k[], cv::Mat classes){
//Split Data in 10 random folds to do cross validation
    int n = trainDataMat.rows;
    std::vector <int> seeds;
    for (int cont = 0; cont < n; cont++)
        seeds.push_back(cont);
    cv::randShuffle(seeds);

    int n10 = floor(n/10);
    cv::Mat train(n10*9, 3, CV_32F);

    trainDataMat.copyTo(train(Rect(0,0,3,n10*9)));

    ...followed by the parameter tuning step
}

trainDataMat 是这种数据类型:

cv::Mat trainDataMat(32505, 3, CV_32F);

当我运行时,在 .copyTo 的行上我得到了错误:

OpenCV Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows)) in create, file /home/aschuett/cppWS/opencv-3.2.0/modules/core/src/matrix.cpp, line 2287
terminate called after throwing an instance of 'cv::Exception'
what():  /home/aschuett/cppWS/opencv-3.2.0/modules/core/src/matrix.cpp:2287: error: (-215) !fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function create

我通读了各种论坛条目,但找不到解决我问题的方法...我用调试器检查了矩阵的大小,但它们是对应的,trainDataMat 有 cls:3 和 rows: 32505,train 有列:3 ​​和行:29250。

也许其他人可以看出我哪里做错了吗?可能是在Rect()函数的使用上?

提前致谢!!干杯

最佳答案

对我有用的:

cv::Rect r(0,0,3,n10*9);
trainDataMat(r).copyTo(train(r));

那么显然在复制之前必须将较大的矩阵调整为“目标矩阵”大小?任何人都可以验证这一点,或者这是一个不同的原因,这只是一种解决方法?;)

关于c++ - 使用 copyTo 函数断言失败 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415761/

相关文章:

python-3.x - 检测点坐标 - opencv findContours()

matlab - 如何在灰度图像的每一行之间添加细水平线?

image - 如何解释 1 bpp BMP 文件中的像素阵列

c++ - 实例化具有回调函数类型的模板

c++ - Qt : qt cannot send events to objects owned by a different thread - Why

c++ - 重定向 C++ fstream

python - 如何选择 NumPy 数组中的所有非黑色像素?

c++ - boost::filesystem::relative() 无法访问该文件,因为它正被另一个进程使用

python - See3CAM/OpenCV 自动白平衡支持

c++ - Opencv 错误 : no GPU support (library is compiled without CUDA support)