首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加浮点openCV3.0

添加浮点openCV3.0
EN

Stack Overflow用户
提问于 2016-06-27 08:30:55
回答 1查看 47关注 0票数 1

实际上,我在openCV3.0上有个问题。我用了12个gabor过滤器(12个不同的方向)在1张图像上,并储存了它们。现在我想把所有这些图像加起来,然后除以每个值,得到12个滤波器的平均值。因为这些图像是RGB的,所以我必须分开处理每个频道。问题是:当我将所有值相加时,我获得的值> 12,而所有的值都在0到1之间。

代码的一部分被窃听:

代码语言:javascript
复制
for (i = 0; i < gaborV.size(); ++i) { //gaborV contain the 12 gabor filters
    std::vector<cv::Mat> vec_split; //I split because of the 3 channels
    cv::split(gaborV[i], vec_split);
    for (int k = 0; k < imgCol.rows; ++k) {
        for (int j = 0; j < imgCol.cols; ++j) {
            if (k == 1 && j == 1)
                std::cout << mat_X.at<float>(k, j) << "    " << vec_split[0].at<float>(k, j) << std::endl;
            mat_X.at<float>(k, j) += vec_split[0].at<float>(k, j);
            mat_Y.at<float>(k, j) += vec_split[1].at<float>(k, j);
            mat_Z.at<float>(k, j) += vec_split[2].at<float>(k, j);

        }
    }
}

mat_X、mat_Y和mat_Z创建如下:mat_X = mat_Y = mat_Z = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));

正如我所说的,vec_split中的所有值都在0到1之间,但是当我退出循环时,mat_X、mat_Y和mat_Z包含值>12。我使用的cout的输出:

代码语言:javascript
复制
0  0.507358
1.54751  0.496143
3.00963  0.528832
4.53887 0.465426
... and at the end I have 15.9459

我不明白,因为0+ 0.507358 != 1.54751;1.54751 + 0.496143 != 3.00963……

有人明白这个问题吗?

谢谢大家!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 08:41:03

我认为问题在于:

代码语言:javascript
复制
mat_X = mat_Y = mat_Z = cv::Mat(cvSize(imgColNormalize.cols,    
                         imgColNormalize.rows), CV_32FC1, cvScalar(0.));

初始化这些数组的方式会导致引用相同数据的所有三个cv::Mat对象。只创建了一个Mat,因此您的代码将这个数组中的值增加三次。

对于信息,OpenCV使用cv::Mat的引用计数机制,赋值操作符只需创建对现有数据的新引用。如果您想要创建cv::Mat的真正的深拷贝,则需要使用cv::Mat::clone()

因此,相反,初始化如下:

代码语言:javascript
复制
mat_X = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));
mat_Y = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));
mat_Z = cv::Mat(cvSize(imgColNormalize.cols, imgColNormalize.rows), CV_32FC1, cvScalar(0.));

以下为后人复制的文献资料摘录:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38049183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档