【发布时间】: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,问题仍然存在。我编辑了我的代码以显示这一点。