【问题标题】:Converting CvMat 8 to CvMat将 CvMat 8 转换为 CvMat
【发布时间】:2011-12-14 15:06:00
【问题描述】:

有没有办法可以将 CvMat * 转换为 CvMat?我被困在必须使用 cvCloneMat() 克隆 CvMat 的地方的代码中。这给了我 CvMat *,因为我需要它作为 CvMat。

我已经尝试过取消引用的事情,但不知何故它不起作用。我正在编写一个抖动/最大外部,它有一个图像矩阵作为输入,一个矩阵作为输出。这是一段代码

    //Convert input and output matrices to OpenCV matrices
    cvJitter2CvMat(in_matrix, &source);
    cvJitter2CvMat(out_matrix, &edges);

    //Calculate threshold values
    thresh1 = x->threshold - x->range;
    thresh2 = x->threshold + x->range;
    CLIP(thresh1,0,255);
    CLIP(thresh2,0,255);



    //calculate
    //cvCanny( &source, &edges, thresh1, thresh2, 3 );
    tempo = cvCloneMat(&source);
    edges = (*tempo);   
} else {
    return JIT_ERR_INVALID_PTR;
}

出来: jit_object_method(out_matrix,gensym("lock"),out_savelock); jit_object_method(in_matrix,gensym("lock"),in_savelock); 返回错误; }

问题是当我使用“cvCanny()”而不是 cvCloneMat() 时,它可以工作。输出显示为视频流的边缘。但如果我使用 cvCloneMat(),它会显示一个空白图像。

【问题讨论】:

    标签: opencv


    【解决方案1】:

    对于任何与指针相关的东西都是如此:

    CvMat* pMat = cvCloneMat(...);
    CvMat mat = (*pMat);
    functionThatNeedsMat(*pMat);
    otherFunctionThatNeedsMat(mat);
    

    也可以查看这篇关于pointer dereferencing的文章

    【讨论】:

    • edges 被声明为 CvMat,而不是 CvMat*。您将速度标头复制到边缘(但不是图像数据)。这是错误的。因为在 temp 超出范围后,没有人知道会发生什么。而且我看到了更多的 CvMat 初始化并且没有发布。仔细阅读 OpenCV 文档并寻找关于指针和内存使用的好教程。接受我的好心建议,开始学习 C/C++,然后去 OpenCV。没有基础,你就无法继续前进。
    • 当您想返回图像处理时,我的建议是使用 C++ 接口。使用 Mat,而不是 CvMat。
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2011-10-18
    • 2012-03-08
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多