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

时间:2012-10-23 14:34:30

标签: c++ opencv matrix

我使用以下函数返回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]

1 个答案:

答案 0 :(得分: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时可能会或可能不会传递float i = N等测试。这就是为什么我通过从你的循环边界0.5N中减去M来做一个小技巧。