我使用 cv::merge 时出错

error when i using cv::merge

我在使用 cv::merge() 语句合并两个图像时遇到以下错误:

OpenCV Error: Assertion failed (mv[i].size == mv[0].size && mv[i].depth() == depth) in merge, file /home/yasin/ProgramFile/opencv-3.0.0/modules/core/src/convert.cpp, line 950 terminate called after throwing an instance of 'cv::Exception' what(): /home/yasin/ProgramFile/opencv-3.0.0/modules/core/src/convert.cpp:950: error: (-215) mv[i].size == mv[0].size && mv[i].depth() == depth in function merge

我试图通过搜索和使用一些方法来解决这个问题,但我的努力没有用。

我的方法是:

void TakeDFT(cv::Mat&source,cv::Mat&DFTofSource){
    cv::Mat OriginalFloat;
    OriginalFloat.convertTo(source,CV_32FC1,1.0/255.0);
    cv::Mat OriginalComplex[2] = {
        OriginalFloat,cv::Mat::zeros(OriginalFloat.size(),CV_32F)
    };
    cv::Mat dftready;
    dftready.convertTo(dftready,CV_32F);
    cv::merge(OriginalComplex,2,dftready);
    cv::dft(dftready,DFTofSource,cv::DFT_COMPLEX_OUTPUT);
}

和:

void TakeDFT(cv::Mat&source,cv::Mat&DFTofSource){
    cv::Mat OriginalFloat;
    OriginalFloat.convertTo(source,CV_32FC1,1.0/255.0);
    cv::Mat OriginalComplex[2] = {
        OriginalFloat,cv::Mat::zeros(OriginalFloat.size(),CV_32F)
    };
    cv::Mat dftready;
    dftready.convertTo(dftready,CV_32F);
    std::vector<cv::Mat>array_to_merge;
    array_to_merge.push_back(OriginalComplex[0]);
    array_to_merge.push_back(OriginalComplex[1]);
    cv::merge(array_to_merge,dftready);
    cv::dft(dftready,DFTofSource,cv::DFT_COMPLEX_OUTPUT);
}

我是 opencv 的初学者并且很困惑。 谁能帮帮我?

您只是声明了 OriginalFloat(没有定义它),然后您尝试转换它(当它是一个空矩阵时)。

我假设你想做的是

source.convertTo(OriginalFloat, CV_32FC1, 1.0/255.0);

您将遇到与 dftready 相同的问题。您需要做的是通过创建矩阵来定义其类型:cv::Mat dftready = cv::Mat dftready(source.size(), CV_32F);,或者简单地声明它 cv::Mat dftready; 并让 cv::merge 函数使用正确的类型创建它。

来自OpenCV 3.0 documentation

The functions merge merge several arrays to make a single multi-channel array.

您的目标矩阵 dftready 创建为单通道矩阵 (CV_32F),而不是 CV_32FC2 的双通道矩阵。