【问题标题】:Segmentation fault - trying to pass matlab code to c ++分段错误 - 试图将 matlab 代码传递给 c++
【发布时间】:2021-02-20 20:18:25
【问题描述】:

我正在尝试传递 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。不知道跟这个有没有关系
  • 我有一个数组,我只想改变 i,保持 j 的值

标签: c++ matlab opencv


【解决方案1】:

如果没有完整的示例,很难说出问题所在。您的代码的一个明显问题是,您在第二个循环中使用了 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 分配内存但没有特定值。看到这个answer

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

j 可能是一个非常大的整数,并且您尝试访问一个超出范围的值。或者使用j 本身会导致错误。正如我所说,行为是未定义的。

编辑我也认为你的代码的第二部分应该改变。 strip(:,i)=1 将二维数组的第 i 列设置为 1。假设 strip.at&lt;uchar&gt;(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;
    }
    //...
}

【讨论】:

  • 我有一个数组,我只想改变 i,保持 j 的值
  • 然后只需将j 初始化为您想要的任何值,例如int j = 0 或者直接说strip.at&lt;uchar&gt;(i,0)
  • 非常感谢,我用的是1,但是因为注意力不集中我忘了opencv用的是255
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多