c++ - openCV/图像处理中创建 MAT 类型的 3 维数组时出现段错误

标签 c++ c opencv image-processing segmentation-fault

我有一张尺寸为 576x720 的图像,我将其分成小部分,从 1.40625x1.125 到 288x360,在每次迭代中使用不同的 roi_width 和 roi_height(从 k = 9 到 k= 1)。我想创建一个 Mat dst_n(3 维,k, x_dim (沿 X 的窗口数) 和 y_dim(沿 Y 的窗口数) 类型的数组,但它在创建时给出段错误?如何正确分配它?

    int a,b;

    a = log_base_n(image1.cols,2);
    b = log_base_n(image1.rows,2);
    double roi_width = (image2.cols)/pow(2.0,a);
    cout << roi_width << endl;
    double roi_height = (image2.rows)/pow(2.0,a);
    cout << roi_height << endl;

    double roi_left = roi_width/2.0;
    cout << roi_left << endl;
    double roi_top  = roi_height/2.0;
    cout << roi_top << endl;

    for(int k=9 ;k>0;k--){

        int x_dim = 2*pow(2.0,k)-1;
        int y_dim = 2*pow(2.0,k)-1;
        cout << "working"<< endl;
        **Mat dst_n[k][x_dim][y_dim];**       // This line is giving segmentation fault. I think, its due to some dynamic allocation, because when I assigned Mat dst[3][3], it was working fine.


        **vector<KeyPoint> vec_keypoints_n[k][x_dim][y_dim];
        Mat descriptors_n[k][x_dim][y_dim];
        Mat bowDescriptor_n[k][x_dim][y_dim];
        double base_test_n[k][x_dim][y_dim];**
        for (int j=0;j<y_dim;j++){
            cout << "working"<< endl;
            for (int i=0;i<x_dim;i++){
                cout << "working"<< endl;
                image2(Rect(roi_left*i,roi_top*j,roi_width,roi_height)).copyTo(dst_n[k][j][i]);
                detector.detect(dst_n[k][j][i],vec_keypoints_n[k][j][i]);
                cout << vec_keypoints_n[k][j][i].size() << endl;
                sift_extractor1->compute(dst_n[k][j][i],vec_keypoints_n[k][j][i],descriptors_n[k][j][i]);
                bowDE.compute(dst_n[k][j][i],vec_keypoints_n[k][j][i], bowDescriptor_n[k][j][i]);
                base_test_n[k][j][i] = compareHist(bowDescriptor1,bowDescriptor_n[k][j][i],0);

                                 cout << "base_test_n = " << base_test_n[k][j][i] << endl;
            }
            cout << "working"<< endl;
        }
        cout << "working"<< endl;
        roi_width = roi_width*2;
        roi_height = roi_height*2;
        roi_left = roi_left*2;
        roi_top = roi_top*2;
    }

我正在从图像中提取一个区域,我想将其存储在数组中。因此,我想创建一个Mat类型的数组,其中数组元素可以存储矩阵(图像的一部分)。

之前,我已经通过使用下面提到的代码成功完成了此操作:这里 dst 是一个二维数组,它使用命令 image2(Rect(roiLeft*i,roiTop*j,roiWidth,roiHeight)).copyTo( dst[j][i]);

类似地,我试图包含一个用于可变窗口大小的变量 k 并创建一个 MAT 类型的 3-D 数组,但它不起作用。我不知道问题出在哪里,或者我该如何使用你的方法?

Mat dst[3][3];
vector<KeyPoint> vec_keypoints[3][3];
Mat descriptors[3][3];
for (int j=0;j<3;j++){
    for (int i=0;i<3;i++){
        image2(Rect(roiLeft*i,roiTop*j,roiWidth,roiHeight)).copyTo(dst[j][i]);
        detector.detect(dst[j][i],vec_keypoints[j][i]);
        cout << vec_keypoints[j][i].size() << endl;
        sift_extractor1->compute(dst[j][i],vec_keypoints[j][i],descriptors[j][i]);

    }
}




Mat dst_n[k][x_dim][y_dim];  // you cannot create a Mat like this

要在 OpenCV 中创建 3D 矩阵,您应该使用

int sizes[] = { k, x_dim, y_dim};
Mat matrix = Mat(3, sizes, CV_64FC1);

最佳答案

Mat dst_n[k][x_dim][y_dim];  // you cannot create a Mat like this

要在 OpenCV 中创建 3D 矩阵,您应该使用

int sizes[] = { k, x_dim, y_dim};
Mat matrix = Mat(3, sizes, CV_64FC1);

关于c++ - openCV/图像处理中创建 MAT 类型的 3 维数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22228557/

相关文章:

c - __func__ 错误

c - 如何检索大文件

c++ - 如何在设计时不知道图像类型时访问 cv::mat 中的数据?

python - OpenCV - imread()、imwrite() 增加了 png 的大小?

c++ - 无法使用 cmake 构建 Opencv 项目

c++ - 简化存储在类的 std::vector 成员中的 std::function 的使用

c++ - 只 move 输入和输出迭代器

将 const char 连接到 char

c++ - 为什么有两个不同的 getline() 函数(如果确实有)?

c++ - QMutableStringListIterator 的 QStringList "not a type"?