在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++ 代码时遇到问题