0

我使用以下函数返回一个介于 0 和 1 之间的值的权重矩阵,具体取决于特定矩阵位置与中心的接近程度。同样在阈值之后,值都为1(它就像高原,靠近中心的点具有值1,并且在距离阈值之后远离中心的点在边缘从1线性下降到0)?

cv::Mat2f getWeightsMatrix(int N, int M, float r){
    cv::Mat2f weights = cv::Mat2f(N,M);
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(i<=floor(N*(1-r)/2)){
                if(j<=floor(M*(1-r)/2)){
                    weights[i][j]=((float)(i/N-j/M)/(1-r));
                }
                else{
                    weights[i][j]=(2*(float)(i/N)/(1-r));
                }
            }
            else if (i>=floor(N*(1+r)/2)){
                if(j>=floor(M*(1+r)/2)){
                    weights[i][j]=(((float)((N-i)/N))-((float)((M-j)/M)))/(1-r);
                }
                else{
                    weights[i][j]=(2*(float)((N-i)/N)/(1-r));
                }
            }
            else{
                if(j<=floor(M*(1-r)/2)){
                    weights[i][j]=(2*(float)(j/M)/(1-r));
                }
                else if(j>=floor(M*(1+r)/2)){
                    weights[i][j]=(2*(float)((M-j)/M)/(1-r));
                }
                else{
                    weights[i][j]=1;
                }
            }
        }
    }
    cout << weights << endl;
    return weights;
}

现在我的问题是我遇到了一些转换问题,并且只返回值 0 和 1(没有浮点数)。当我使用 N=10、M=10 和 r=0.5 调用函数时,cout 显示的矩阵大小也是 20x10。

请帮忙!

编辑:这是输出

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
4

1 回答 1

4

您的矩阵仅包含整数,因为当您对整数进行基本操作时,结果会自动四舍五入。

例如:当你写

weights[i][j]=((float)(i/N-j/M)/(1-r));

的结果i/N四舍五入为整数,j/M也四舍五入为整数,最后除以(1-r)也四舍五入。你的(float)演员阵容是个好主意,但应用得太晚了

你可以做几件事:

  • 例如,在基本操作中强制转换,float(i)/N而不是i/N
  • 使用浮点数而不是整数:写1.0而不是1
  • 在循环和语句中使用浮点数

例如:

for(float i = 0; i < N-0.5; i++) {
    for(float j = 0; j < M-0.5; j++) {
        if(i <= floor(N*(1.0-r)/2.0)) {
            // ...

重要的是您要了解,由于浮点精度,诸如i < N可能通过或可能不通过 when之类的测试float i = N。这就是为什么我通过0.5从你的循环边界NM.

于 2012-10-23T15:07:15.380 回答