OpenCV - 迭代向量时出现“无效参数”

Posted

技术标签:

【中文标题】OpenCV - 迭代向量时出现“无效参数”【英文标题】:OpenCV - "Invalid paramater" when iterating through a vector 【发布时间】:2016-09-09 23:07:13 【问题描述】:

我正在尝试遍历图像路径向量,使用 cv::imread 函数读取它们,然后在生成的 cv::Mat 上使用 format_signal 函数。

#include "tp1.hpp"

using ImagePathFlag = std::pair<std::string, int>; 

int main(int /*argc*/, char** /*argv*/) 
    try 
        const std::vector<ImagePathFlag> vsTestImages = 
             "data/test1.png",cv::IMREAD_GRAYSCALE ,
             "data/test2.png",cv::IMREAD_GRAYSCALE ,
             "data/test3.png",cv::IMREAD_GRAYSCALE ,
             "data/test4.png",cv::IMREAD_COLOR ,
             "data/test5.png",cv::IMREAD_COLOR ,
             "data/test6.png",cv::IMREAD_COLOR ,
             "data/test7.png",cv::IMREAD_COLOR ,
             "data/test8.jpg",cv::IMREAD_COLOR ,
             "data/test9.bmp",cv::IMREAD_COLOR ,
             "data/test10.bmp",cv::IMREAD_COLOR ,
        ;
        for (const ImagePathFlag& oImagePathFlag : vsTestImages) 
            std::cout << oImagePathFlag.first << std::endl;
            cv::Mat oInputImg = cv::imread(oImagePathFlag.first, oImagePathFlag.second);
            if (oInputImg.empty())
                CV_Error_(-1, ("Could not load image at '%s', check local paths", oImagePathFlag.first.c_str()));

            std::vector<uint8_t> signal = format_signal(oInputImg);


        
    
    catch (const cv::Exception& e) 
        std::cerr << "Caught cv::Exceptions: " << e.what() << std::endl;
    
    catch (const std::runtime_error& e) 
        std::cerr << "Caught std::runtime_error: " << e.what() << std::endl;
    
    catch (...) 
        std::cerr << "Caught unhandled exception." << std::endl;
    
    return 0;

format_signal 和 lz77_encode 似乎在第一次迭代或 for 循环时工作正常,但在第一次迭代结束时,程序崩溃并出现以下错误:

在 0x00007FFE6E5D4388 (ucrtbase.dll) 中未处理的异常 inf4710_tp1.exe:一个无效的参数被传递给一个函数 认为无效参数是致命的。

不太清楚这里发生了什么。我承认我没有完全理解 for 循环的语法,因为它是我的老师提供的。

有什么帮助吗?

编辑

inline std::vector<uint8_t> format_signal(const cv::Mat& oInputImage) 
    CV_Assert(!oInputImage.empty() && oInputImage.isContinuous() && (oInputImage.type() == CV_8UC1 || oInputImage.type() == CV_8UC3));

    std::vector<uint8_t> vSignal;
    cv::imencode(".png", oInputImage, vSignal);
    return vSignal;

【问题讨论】:

离题:你从老师那里得到了现代 C++ 代码?由克罗姆!未来有希望! 问题肯定出在lz77_encode;缓冲区溢出或某种其他形式的堆栈损坏。不看来源很难说。 即使我没有在 main 中调用 lz77_encode,问题仍然存在。我编辑了我的代码以显示这一点。 【参考方案1】:

我承认我没有完全理解 for 循环的语法

您正在使用 C++11 及更高版本中可用的基于范围的 for 循环。它遍历对向量中的每个项目。 你调试过你的问题吗?如果是这样,你能分享你到目前为止所看到的吗?你的 format_signal 做什么?该功能是否一切正常?

【讨论】:

1.您是否正在使用调试符号构建应用程序?如果是这样,您可以通过 gdb/lldb/other 调试器运行您的应用程序并查看堆栈跟踪吗?要检查的另一件事是注释掉对 format_signal 的调用,以查看该函数是否是错误的根源。我没有可用的 OpenCV 3.0,所以我无法重现您的问题。我很愿意,但我无法更改我的设置。

以上是关于OpenCV - 迭代向量时出现“无效参数”的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV (2.4.5) 时出现内存异常

Eclipse CDT - 使用模板默认值时出现“无效参数”

执行 python scikit-learn 网格搜索方法时出现无效参数错误

在指向向量的智能指针上使用 push_back() 时出现运行时错误

在 VS Code 上模拟 Android 时出现“无效参数:找不到 null 的可执行文件” - Mac OS X

将 std::vector 与结构一起使用时出现不完整的类型错误