在matlab中调用时无法在C++中使用opencv读取图像

Posted

技术标签:

【中文标题】在matlab中调用时无法在C++中使用opencv读取图像【英文标题】:Fail to read an image with opencv in C++ when call it in matlab 【发布时间】:2017-08-02 07:13:09 【问题描述】:

我将在 C++ 程序中使用 cv::imread 加载图像。当我直接在终端中运行它时,它运行良好。但是当我在 matlab 中用“system”或“dos”调用它时,它总是返回空 Mat 而没有任何错误。

我在 MacOS Sierra 10.12.4 中工作。 OpenCV 版本是 2.4.13。 Matlab 版本为 R2015b。有人可以帮我吗?请给我一些建议。

比如我写了一个测试代码。

#include <opencv2/opencv.hpp>
int main()
    std::string  path = "/Users/zhefeng.wzf/0001.jpg";
    cv::Mat image = cv::imread(path);

    if(image.empty())
        printf("Cannot load image:%s\n",path.c_str());
    else
        printf("Load the image successfully.\n");
        cv::imshow("image",image);
        cv::waitKey();
    

    return 0;

然后我用

编译它

g++ readImg.cpp -o readImg `pkg-config --cflags --libs opencv`

当我在终端中运行它时, It works well.

但是当我在 matlab 中运行它时, it failed

【问题讨论】:

你在 C++ 程序中传递给cv::imread() 的路径是什么?尝试使用完全限定路径。 我将绝对路径传递给 cv::imread()。我确定它可以找到该文件。 路径是/Users/zhefeng.wzf/ 我认为问题是最后一个文件夹的名称,它有.wzf 可能会导致问题,更改文件夹名称再试一次跨度> 我更改了名称文件夹,但仍然失败。 :( 【参考方案1】:

它失败了,因为 Matlab 使用了它自己的 OpenCV dylib,它与您的应用程序版本不兼容。只需使用DYLD_INSERT_LIBRARIES(在Linux 中等于LD_PRELOAD)强制Matlab 使用您应用的OpenCV 版本。

您可以使用otool(在linux 中等于ldd)找到您应用的版本

otool -L /path/to/your/app/app

这将提供您的应用使用的所有 dylib。打开你的 Matlab

DYLD_INSERT_LIBRARIES="path/to/dylib.dylib:another/path/dylib2.dylib" /path/to/matlab

运行您的代码,这应该可以工作。

【讨论】:

哇!您的解决方案完美地解决了我的问题。非常感谢! Matlab在/Applications/MATLAB_R2015b.app/bin/maci64有自己的opencv库,可能与系统opencv冲突。

以上是关于在matlab中调用时无法在C++中使用opencv读取图像的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 MEX Wrapper 的辅助 C 文件从 MATLAB 2016 调用 C++ 代码时遇到问题

C++调用matlab数学函数问题

转C++调用Matlab的.m文件

在c++中调用MATLAB函数

使用java.lang.Runtime.getRuntime无法在matlab中调用多个python脚本实例

使用 MatLab dll 时出现 C++ 错误:找到一个或多个多重定义符号