convertTo 在 opencv 中不起作用

Posted

技术标签:

【中文标题】convertTo 在 opencv 中不起作用【英文标题】:convertTo not working in opencv 【发布时间】:2016-01-12 01:12:14 【问题描述】:

我正在尝试在 opencv C++ 中使用 convertTo()。但是弹出一个错误提示

left of: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);
        
    

【问题讨论】:

此代码适用于我...请发布minimal reproducible example 您是否确保为您的 Visual Studio 版本使用正确的 OpenCV-dll(如果您使用的是 vs)?有时这会导致奇怪的程序行为。我曾经忘记文件夹 VC12 不是 VS2012 的,所以遇到了这样的问题。 【参考方案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);
    
    // ...

更新

根据source code of .convertTo(),我的建议并不是真正需要的(感谢@boaz001 指出这一点)。

【讨论】:

这不是必需的。如果目标的类型与源不匹配,则会重新分配。这可以通过在convertTo 之前/之后打印planes[k].type() 来验证。 @boaz001 嗯,看来你是对的。根据source code of .convertTo(),我的建议是没有必要的。【参考方案2】:

Left:of 语句表明它的 null 或 undefined IE。 outplanes[k] 不包含您认为应该包含的内容。

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

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

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

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

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

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

有点取决于您的代码以及 outplanes 方法/类实际上在做什么,但我想它并没有返回您认为应该是的内容。

【讨论】:

以上是关于convertTo 在 opencv 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

cvCanny 在 opencv 2.3 中不起作用

OpenCV 函数在 Python 和 C++ 中不起作用

#include <opencv2/opencv.hpp> 在 VS 2013 中不起作用

Matx33d 点积在 OpenCV 中不起作用

网络摄像头在 Ubuntu 12.04 中不起作用,适用于奶酪,不适用于 OpenCV

ConvertTo-PnPClientSidePage 在 PnP PowerShell 中不可用