c++ - 添加 float openCV3.0

标签 c++ opencv opencv3.0

其实我在openCV3.0上有问题。 我在一张图片上使用了 12 个 gabor 过滤器(12 个不同的方向)并将它们储存起来。 现在我想添加所有这些图像,然后将每个值除以 12 以获得 12 个过滤器的平均值。 因为这些图像是 RGB,所以我必须分别处理每个 channel 。 问题是:当我添加所有值时,我得到值 > 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 包含的值 > 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 ...

有人理解这个问题吗?

谢谢大家!

最佳答案

我觉得问题出在这里:

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

关于c++ - 添加 float openCV3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049183/

相关文章:

c++ - vector 投影 - 确保我的车辆只能在地板/表面上加速

C++ 变量不变

c++ - 带有 std::transform 的 Visual 中的错误 C3861

python - 在圆内寻找轮廓

python - 从(嘈杂的)纯色背景中提取单个对象

python - 是否可以对多个图像使用 cv2.HoughCircles 函数?

c++ - 在 Qt 中使用鼠标事件裁剪 QImage

c++ - 为什么在 new 之前添加::operator 关键字用于内存分配?

python-2.7 - 与opencv 3 ORB中的匹配错误

android - 如何在不在设备中安装 opencv 管理器的情况下使用 openCV Camera?