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
相关产品推荐
相关产品推荐

