opencv/modules/core/src/matrix_wrap.cpp:72:错误:(-215:断言失败)0<= i && i < (int)vv.size() in function 'getMat_'

问题描述 投票:0回答:1

你能帮我解决这个错误吗?

a
b
是 2-double 数组,由行和列定义。
a
是给定矩阵:
cv::resize(a,b,cv::Size(newrows,newcols),0,0,INTER_CUBIC);

我可以编译,但运行时出现错误:

terminate called after throwing an instance of 'cv::Exception'
what():  OpenCV(4.10.0-dev) /home/xx/opencv/modules/core/src/matrix_wrap.cpp:72: error: (-215:Assertion failed) 0 \<= i && i \< (int)vv.size() in function 'getMat\_'

代码如下:

std::vector <vector<double>> at,ax;
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);
    }
for(int i=0;i<2;i++) {
    vector<double> v12;
        for(int j=0;j<2;j++) {
            v12.push_back(0);           
        }
        ax.push_back(v12);
    }       
for(int i=0;i<4;i++) {
    for(int j=0;j<4;j++) {      
        cout<<"  "<<at[i][j];
    }
    cout<<endl;
}
cv::resize(at,ax,cv::Size(2,2),0,0,INTER_CUBIC);
for(int i=0;i<2;i++) {
    for(int j=0;j<2;j++) {      
        cout<<"  "<<ax[i][j];
    }
    cout<<endl;
}

结果是:

  0  1  2  3
  4  5  6  7
  8  9  10  11
  12  13  14  15
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.10.0-dev) /home/taduong/opencv/modules/core/src/matrix_wrap.cpp:72: error: (-215:Assertion failed) 0 <= i && i < (int)vv.size() in function 'getMat_'

Aborted
c++ arrays opencv resize double
1个回答
0
投票

你能帮我解决这个错误吗?

问题的根源似乎是 opencv 库本身的错误。
我不确定是否/何时会修复。

但无论如何,我建议使用 opencv (和

cv::resize
)和
cv::Mat
,这是 opencv 的自然矩阵容器。

它也更适合表示 2D 数组,

vector<vector<T>>
,这要归功于连续内存布局,它更高效且缓存友好。
一般来说,它也被认为是一个相当好的矩阵类。

以下是如何在您的案例中使用它的示例:

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

int main()
{
    // Create and fill input:
    cv::Mat at1(4, 4, CV_64FC1);
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            at1.at<double>(j, i) = 4. * i + j;
        }
    }

    // Print input:
    std::cout << "Input:\n";
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << "  " << at1.at<double>(j, i);
        }
        std::cout << std::endl;
    }

    // Perform resize and create output:
    cv::Mat ax1;  // no need to initialize - will be done by cv::resize
    cv::resize(at1, ax1, cv::Size(2, 2), 0, 0, cv::INTER_CUBIC);

    // Print output:
    std::cout << "\nOutput:\n";
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            std::cout << "  " << ax1.at<double>(j,i);
        }
        std::cout << std::endl;
    }
}

输出:

Input:
  0  1  2  3
  4  5  6  7
  8  9  10  11
  12  13  14  15

Output:
  2.03125  4.21875
  10.7812  12.9688

旁注:

  1. 正如上面所评论的,您选择的三次插值滤波器对于这些矩阵大小来说并不是一个好的选择,但我认为在实际情况下它们更大。
  2. 为了更有效地访问
    cv::Mat
    元素,请使用
    cv::Mat::ptr
    获取行指针,而不是使用
    cv::Mat::at
    访问每个元素。
© www.soinside.com 2019 - 2024. All rights reserved.