繁体   English   中英

为什么此OpenCV矩阵的大小和值不正确?

[英]Why is the size and values of this OpenCV Matrix incorrect?

我使用以下函数来返回权重矩阵,其值介于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]

您的矩阵仅包含整数,因为对整数执行基本运算时,结果会自动舍入。

例如:当你写

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)) {
            // ...

重要的是要理解,由于浮点精度 ,当float i = N时,诸如i < N的测试可能会通过,也可能不会通过。 这就是为什么我通过从循环界限NM减去0.5来做点小技巧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM