gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:21:03 25 4
gpt4 key购买 nike

我使用以下函数返回一个权重矩阵,其值介于 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(没有 float )。当我使用 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
  • 使用 float 代替整数:写1.0而不是 1
  • 在循环和语句中使用 float

例如:

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.5 做了一个小把戏。从你的循环边界 NM .

关于c++ - 为什么这个 OpenCV 矩阵的大小和值不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13032876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com