OpenCV - 迭代向量时的"Invalid paramater"

OpenCV - "Invalid paramater" when iterating through a vector

本文关键字:Invalid paramater 迭代 向量 OpenCV      更新时间:2023-10-16

我试图迭代图像路径的向量,用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;
}
我承认我不完全理解for循环的语法

您正在使用c++ 11及以后版本中可用的基于范围的for循环。它遍历对向量中的每一项。您排除问题了吗?如果有,你能分享一下你目前看到的情况吗?format_signal的作用是什么?在该函数中是否一切正常工作?