添加float openCV3.0

时间:2016-06-27 08:30:55

标签: c++ opencv opencv3.0

我确实在openCV3.0上遇到了问题。 我在1张图像上使用了12个gabor滤镜(12个不同的方向)并存放了它们。 现在我想添加所有这些图像,然后除以12每个值,以获得12个滤镜的平均值。 因为这些图像是RGB,所以我必须分别处理每个通道。 问题是:当我添加所有值时,我获得值> 12,而所有值都在0和1之间。

代码的一部分出现了错误:

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包含值&gt; 12 .. 我使用的cout的输出:

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 ......

有人了解这个问题吗?

谢谢大家!

1 个答案:

答案 0 :(得分:1)

我认为问题在于:

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()

所以,相反,初始化如下:

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.));

以下复制的the documentation摘录为后代:

opencvdoc