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 - 迭代向量时出现“无效参数”的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse CDT - 使用模板默认值时出现“无效参数”
执行 python scikit-learn 网格搜索方法时出现无效参数错误
在指向向量的智能指针上使用 push_back() 时出现运行时错误