Mac下配置OpenCV的过程可以参考Mac下OpenCV环境搭建。
最近在编写OpenCV程序时遇到了一个不大不小的问题,使用imread函数读取图片时相对路径不起作用,只能使用绝对路径,比如我在桌面上创建了一个test工程,其绝对路径为/Users/mac/Desktop/test,在该路径下创建一个images文件夹,里面存放用来处理的两张图片lena.jpg和ellipse.jpg,于是工程的文件结构如下:
使用如下代码读取时,发现图片路径发生错误。
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, const char * argv[]) {
Mat image;
image = imread("./lena.jpg");
namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", image);
waitKey(0);
return 0;
}
当将其中的image = imread(“./lena.jpg”);改为image = imread(“/Users/mac/Desktop/test/images/lena.jpg”);发现读取图片成功,这说明读取绝对路径成功,但是相对路径有问题。
其实这是因为Xcode在新建每个C++工程时,默认给工程分配了工作路径,比如我创建的test工程的工作路径为/Users/mac/Library/Developer/Xcode/DerivedData/test-anopxdbrcwpmycdtmfelcsbyamnr/Build/Products/Debug/,在最后的Debug文件夹下存放着工程生成的可执行文件(类似于windows下的exe文件),在Debug文件下放两张测试图片lena.jpg和ellipse.jpg,如下图:
之后在Xcode中通过如下测试代码是可以正确显示图片的,这说明Xcode分配的工作路径确实跟猜想的一样。
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, const char * argv[]) {
Mat image;
image = imread("./lena.jpg");
namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", image);
waitKey(0);
return 0;
}
但是这种工作路径是不符合我们的习惯的,我们希望工作路径跟工程路径一致,即工作路径也是/Users/mac/Desktop/test,如下图在Xcode中点击工程名,选择Edit Scheme,之后在Use custom working directory前打钩,并将工作路径修改为/Users/mac/Desktop/test。
这样通过相对路径读取图片的代码就可以运行通过了,代码如下,注意图片的相对路径为./images/lena.jpg。
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, const char * argv[]) {
Mat image;
image = imread("./images/lena.jpg");
namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", image);
waitKey(0);
return 0;
}