You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV调用resize处理嵌套vector触发cv::Exception断言失败问题求助

OpenCV调用resize处理嵌套vector触发cv::Exception断言失败问题求助

看起来你遇到的问题是直接把C++标准库的嵌套vector传给OpenCV的resize函数导致的断言失败,我来帮你梳理下问题原因和解决办法:

问题根源

OpenCV的cv::resize函数的输入、输出参数需要是OpenCV原生的cv::Mat类型,而不是C++标准库的std::vector<std::vector<double>>。你直接传嵌套vector时,OpenCV内部在尝试自动类型转换的过程中会出现数组访问越界,就触发了0 <= i && i < (int)vv.size()的断言失败。

解决步骤&修正后的代码

我们需要先把嵌套vector转换成cv::Mat,调用resize后再按需转换回嵌套vector,具体代码如下:

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    // 初始化输入嵌套vector at
    std::vector<vector<double>> at;
    for(int i=0;i<4;i++) {
        vector<double> v11;
        for(int j=0;j<4;j++) {
            v11.push_back(double(4*i+j));           
        }
        at.push_back(v11);
    }

    // 1. 把输入vector转换成cv::Mat(类型为CV_64F,对应double)
    cv::Mat mat_at(at.size(), at[0].size(), CV_64F);
    for (int i = 0; i < mat_at.rows; ++i) {
        memcpy(mat_at.ptr<double>(i), at[i].data(), at[i].size() * sizeof(double));
    }

    // 2. 创建输出的cv::Mat,指定目标尺寸2x2
    cv::Mat mat_ax(Size(2, 2), CV_64F);

    // 3. 调用cv::resize(现在用Mat类型参数就没问题了)
    cv::resize(mat_at, mat_ax, Size(2, 2), 0, 0, INTER_CUBIC);

    // 4. 按需把输出Mat转换回嵌套vector ax
    std::vector<vector<double>> ax(mat_ax.rows, vector<double>(mat_ax.cols));
    for (int i = 0; i < mat_ax.rows; ++i) {
        for (int j = 0; j < mat_ax.cols; ++j) {
            ax[i][j] = mat_ax.at<double>(i, j);
        }
    }

    // 打印原矩阵
    cout << "原矩阵:" << endl;
    for(int i=0;i<4;i++) {
        for(int j=0;j<4;j++) {      
            cout << "  " << at[i][j];
        }
        cout << endl;
    }

    // 打印resize后的矩阵
    cout << "resize后的2x2矩阵:" << endl;
    for(int i=0;i<2;i++) {
        for(int j=0;j<2;j++) {      
            cout << "  " << ax[i][j];
        }
        cout << endl;
    }

    return 0;
}

额外说明

  • 如果你不需要保留嵌套vector的中间结果,可以全程用cv::Mat来处理,这样代码会更简洁高效
  • OpenCV的大部分图像处理函数都是围绕cv::Mat设计的,尽量使用原生类型可以避免很多类型转换的坑
  • 注意Mat的类型要和数据匹配:CV_64F对应double,CV_32F对应float,CV_8U对应uchar等,类型不匹配也会导致各种奇怪的错误

备注:内容来源于stack exchange,提问作者user28186790

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:07:59