分段错误-试图将matlab代码传递给c++



我正试图传递一个在matlab中用于c++的代码,但它出现了分段错误(核心转储(,有人能帮我吗?

MATLAB 中的代码

function strip = strips(strip,n,number_pixel)
se = strel('square', 3);
strip=imdilate(strip, se);
strip = imfill(strip);
[m1,n1] = size(strip);
vet=0;
for j=1:n1
for i=1:m1
if strip(i,j)==0
vet=vet+1;
end
end
aux(j)=vet;
vet=0;
end
limite=uint8(number_pixel/4);
for i=1:n1
if aux(i) < limite
strip(:, i)=1;
end
if aux(i) >= limite
strip(:, i)=0;
end
end
end

C++中的代码

Mat strips(Mat strip, int n, int number_pixel){
int vet = 0;
int limite = (number_pixel/4);
int v[strip.cols];
dilate(strip, strip, getStructuringElement(MORPH_ELLIPSE, Size(3,3)));
strip = imfill(strip);
int n1 = strip.cols;
int m1 = strip.rows;
for (int j = 0; j < n1; j++){
for (int i = 0; i < m1; i++){
if(strip.at<uchar>(i, j) == 0){
vet += 1;
}
}   
v[j] = vet;
vet = 0;             
}

for (int i = 0; i < n1; i++){
int j;
if (v[i] < limite){
strip.at<uchar>(i, j) = 1;    
}
if (v[i] >= limite){
strip.at<uchar>(i, j) = 0;
}
}
}

我已经实现了imfill的功能,我认为我的错误在循环中,但我找不到

当没有一个完全可用的示例时,很难判断问题是什么。代码的一个明显问题是,在第二个循环中使用未初始化的j

for (int i = 0; i < n1; i++){
int j;
if (v[i] < limite){
strip.at<uchar>(i, j) = 1;    // <- uninitialized j is used
}
//...
}

这是未定义的行为,基本上一切都可能发生。j分配内存,但没有特定的值。看到这个答案:

局部变量从它们当时占据的堆栈空间中的任何随机数据中获取它们的初始值。

也就是说,j可能是一个非常大的整数,并且您试图访问一个越界的值。或者使用j本身会导致错误。正如我所说,这种行为是不明确的。

EDIT我还认为应该更改代码的第二部分。CCD_ 5将2D阵列的第i列设置为CCD_。假设strip.at<uchar>(i, j)只返回对单个值的引用,那么您的c++代码应该是这样的:

for (int i = 0; i < n1; i++){
if (v[i] < limite){
// go through all rows and set the i-th column to 1.
for (int j = 0; j < m1; ++j)
strip.at<uchar>(j, i) = 1;
}
//...
}

相关内容

  • 没有找到相关文章

最新更新