[英]Segmentation Fault in creation of 3-dim array of type MAT in openCV/image Processing
我的图像尺寸为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;
}
我正在从Image中提取区域,并且要将其存储在数组中。 因此,我想创建一个Mat类型的数组,其中数组元素可以存储矩阵(图像的一部分)。
之前,我已经通过使用下面提到的代码成功完成了此操作:dst是一个二维数组,使用命令image2(Rect(roiLeft * i,roiTop * j,roiWidth,roiHeight))。copyTo(dst [j ][一世]);
同样,我试图为可变窗口大小包括一个变量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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.