OpenCV中的convertTo函数无法工作

4
我正在尝试在OpenCV C++中使用convertTo()方法,但是出现了以下错误:

convertTo的左侧必须是类/结构体/联合体

下面是程序代码:
for (i = 0; i < height; i += 8)
{
    for (j = 0; j < width; j += 8)
    {
        Mat block = dctImage(Rect(j, i, 8, 8));
        vector<Mat> planes;
        split(block, planes);
        vector<Mat> outplanes(planes.size());
        for (k = 0; k < planes.size(); k++) {
            planes[k].convertTo(planes[k], CV_32FC1);
            dct(planes[k], outplanes[k]);
            outplanes[k].convertTo(outplanes[k], CV_8UC1);
        }
    }
}

1
这段代码对我有效... 请发布一个 [mcve] - Miki
你确定在使用Visual Studio时,已经使用了正确的OpenCV-dlls版本吗?有时候这会导致程序出现奇怪的行为。我曾经忘记过VC12文件夹不适用于VS2012,结果就遇到了类似的问题。 - Mickey
2个回答

1

我不确定.convertTo()能否处理源和目标相同的情况。您可能需要尝试使用一对临时变量来解决错误信息。以下是您示例中相关的部分:

    // ...
    for (k = 0; k < planes.size(); k++) {
        Mat planes_k, outplanes_k;                     // <-- Added temporaries.
        planes[k].convertTo(planes_k, CV_32FC1);
        dct(planes_k, outplanes_k);
        outplanes_k.convertTo(outplanes[k], CV_8UC1);
    }
    // ...

更新

根据.convertTo()的源代码,我的建议实际上并不是必需的(感谢@boaz001指出这一点)。


如果目标类型与源类型不匹配,则会重新分配。在进行convertTo之前/之后,可以通过打印planes[k].type()来验证这一点。 - boaz001
@boaz001 嗯,看来你是对的。根据.convertTo()源代码,我的建议是不必要的。 - nils

1

左侧的语句表明其为null或undefined,即outplanes[k]可能不包含您认为应该包含的内容。

我进行了快速搜索,看起来这可能是编译器问题,编译器难以理解/解释该行代码...

vector<Mat> outplanes(planes.size());

https://en.wikipedia.org/wiki/Most_vexing_parse

什么是outplanes?它是否被正确实例化?

“Most_vexing_parse”文章建议使用额外的括号来帮助编译器。

vector<Mat> outplanes((planes.size()));

取决于你的代码和outplanes方法/类实际执行的操作,但我想它返回的可能不是你认为应该返回的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接