如何在C++代码中调用Octave的imread等图像处理函数?
解答
可以在C++代码中调用Octave的imread、imshow、imhist这类图像处理函数。
你之前只能调用oct.h或octave.h中的原生函数,是因为imread这类函数属于Octave image扩展包提供的M函数,无法直接通过引入头文件的方式调用,需要借助Octave C++接口的feval方法执行M函数,最终效果和Octave交互环境下的调用结果完全一致。
实现示例
和你给出的OpenCV调用逻辑对应,Octave的C++调用实现如下:
1. 前置依赖
首先确保你的Octave 4.2.2已经安装了image扩展包,否则调用imread会提示函数不存在。
2. 代码实现
#include <octave/oct.h> #include <octave/parse.h> #include <octave/interpreter.h> int main () { // 初始化Octave解释器 octave::interpreter interp; interp.initialize (); // 加载image扩展包 interp.execute ("pkg load image"); // 构造imread的入参 octave_value_list imread_args; imread_args(0) = "rice.jpg"; // 调用imread,第3个参数表示预期返回1个结果 octave_value_list imread_ret = feval ("imread", imread_args, 1); if (imread_ret.empty() || imread_ret(0).is_undefined ()) { // 读取失败的异常处理 return 1; } // 获取读取到的图像矩阵,可直接用于后续处理或传给其他Octave函数 Matrix img_mat = imread_ret(0).matrix_value(); // 示例:调用imshow展示图像 octave_value_list imshow_args; imshow_args(0) = imread_ret(0); feval ("imshow", imshow_args, 0); // 0表示不需要返回值 // 阻塞等待图形窗口关闭 interp.execute ("pause();"); return 0; }
3. 编译方式
直接使用Octave自带的mkoctfile工具编译即可自动处理头文件和链接依赖,编译命令如下:
mkoctfile --link-stand-alone 你的源码文件名.cpp -o 生成的可执行文件名
补充说明
- 所有Octave自带或扩展包提供的M函数,都可以通过
feval的方式在C++中调用,只需修改feval的第一个参数为目标函数名,按顺序传入参数即可。 - 如果不需要图形相关操作,可删掉示例中imshow和pause的相关代码,不会影响图像读取逻辑。
内容的提问来源于stack exchange,提问作者upuaut-wq
相关产品推荐
相关产品推荐

