花了几天时间试图找出为什么opencv DFT会为所有三个通道提供100%相似的结果我最终发现splitCV可能存在一个错误,OpenCV提供了将输入图像拆分为3个单独的错误频道图片.
std::vector<cv::Mat> rgbChannels(3,cv::Mat(inputImage.size(),CV_64FC1));
cv::split(inputImage, rgbChannels);
Run Code Online (Sandbox Code Playgroud)
将图像值保存到磁盘上并使用文件差异工具后,我发现分割通道中的所有值都相同.
我做错了什么吗?
我的工作是以下功能.但这也给了我完全相同的值,给了我一个暗示,OpenCV无法正确处理矢量.
SplitImage(cv::Mat inputImage)
{
//copy original in BGR order
std::vector<cv::Mat> splittedImage(3,cv::Mat(inputImage.size(),CV_64FC1));
cv::Mat tempImage(inputImage.size(),CV_64FC1);
for (int row = 0; row < inputImage.size().height; row++)
{
for (int col = 0; col < inputImage.size().width; col++)
{
splittedImage[0].at<double>(row, col) = inputImage.at<cv::Vec3d>(row, col)[0];
splittedImage[1].at<double>(row, col) = inputImage.at<cv::Vec3d>(row, col)[1];
splittedImage[2].at<double>(row, col) = inputImage.at<cv::Vec3d>(row, col)[2];
}
}
return splittedImage;
}
Run Code Online (Sandbox Code Playgroud)
最后写了以下来解决问题
SplitImage(cv::Mat inputImage)
{
//copy original in BGR order
std::vector<cv::Mat> splittedImage(3,cv::Mat(inputImage.size(),CV_64FC1));
std::vector<cv::Mat>::iterator it;
it = splittedImage.begin();
for(int channelNo = 0; channelNo < inputImage.channels(); channelNo++)
{
cv::Mat tempImage(inputImage.size(),CV_64FC1);
for (int row = 0; row < inputImage.size().height; row++)
{
for (int col = 0; col < inputImage.size().width; col++)
{
tempImage.at<double>(row, col) = inputImage.at<cv::Vec3d>(row, col)[channelNo];
}
}
it = splittedImage.insert ( it , tempImage );
it++;
}
return splittedImage;
}
Run Code Online (Sandbox Code Playgroud)
有没有人有split()函数的问题或我做错了什么?
它不是OpenCV中的错误,但是您的代码存在问题.
以下行不会创建3个不同Mats的向量:
std::vector<cv::Mat> rgbChannels(3,cv::Mat(inputImage.size(),CV_64FC1));
Run Code Online (Sandbox Code Playgroud)
相反,该行生成一个共享相同内存的3个Mat头的向量.它的工作方式是这样的,因为Mat复制构造函数不会进行深层复制 - 它只是递增内部引用计数器.
只需将代码更改为以下内容即可解决问题:
std::vector<cv::Mat> rgbChannels(3);
cv::split(inputImage, rgbChannels);
Run Code Online (Sandbox Code Playgroud)