添加浮动 openCV3.0
Posted
技术标签:
【中文标题】添加浮动 openCV3.0【英文标题】:adding float openCV3.0 【发布时间】:2016-06-27 08:30:55 【问题描述】:其实我在 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 包含的值 > 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】:我认为问题出在这里:
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 的摘录复制如下以供后代使用:
【讨论】:
你摇滚不止一点点!实际上,这就是问题所在,那是我不知道的事情……今晚我会少一点无知去睡觉!再次感谢!以上是关于添加浮动 openCV3.0的主要内容,如果未能解决你的问题,请参考以下文章