liunx 下 C/C++调用luajit
来源:互联网 发布:ios app监控编程 编辑:程序博客网 时间:2024/04/29 19:40
参考了很多网上的资料,但大部分都是直接调用lua的 ,因为lua和luajit 的API相互兼容,所以很多程序都可以直接调用。
参考网址:http://www.apihome.cn/api/lua/lua_newthread.html
http://www.jb51.net/article/55843.htm
http://blog.sina.com.cn/s/blog_932db1950101l5wy.html
先上代码:
这是test.c 的代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "luajit.h"#include "lua.h"#include "lauxlib.h"#include "lualib.h"/*extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"#include "luajit.h"};*///如果使用C++编译的。不屏蔽这几条语句,但是要把上面几个相同的头文件屏蔽//并把.C修改为.cppconst char str1[]= "/home/lyz/opencv测试/firstopencv/1.jpg";const char str2[]= "/home/lyz/opencv测试/firstopencv/2.jpg";static lua_State *globalL = NULL;lua_State* L;int luaadd(const char str1[],const char str2[]){ luaL_openlibs(L); float sum; lua_getglobal(L,"test"); //the function name lua_pushstring(L,str1); lua_pushstring(L,str2); lua_call(L, 2, 1); //call 2 arguments, return 1 result. sum = (float)lua_tonumber(L, -1);//get the result. lua_pop(L,-1); //cleanup the return return sum;}int main(int argc, char *argv[]){ float table[129]; //initialize Lua float sum; int i; L = lua_open(); //load Lua base libraries luaL_openlibs(L); //load the script luaL_dofile(L, "test.lua"); //call the add function sum = luaadd(str1,str2); lua_close(L); //对数据TXT计算距离 FILE *fin; float a[128]; //int i; fin = fopen("image2.txt","r"); for (i=0;i<128;i++) fscanf(fin,"%f", &a[i]); fclose(fin); //for (i=0;i<128;i++) //printf("%f\n",a[i]); //printf("***********************\n"); //printf("***********************\n"); FILE *fbn; float b[128]; fbn = fopen("image1.txt","r"); for (i=0;i<128;i++) fscanf(fbn,"%f", &b[i]); fclose(fbn); //for (i=0;i<128;i++) //printf("%f\n",b[i]); double dis; double D=0; for (i=0;i<128;i++) { D=D+((a[i]-b[i])*(a[i]-b[i])); } //dis = sqrt(D); printf("********两张图片的欧式距离为:**********\n"); printf ("%f\n",D); return 0;}
这是test.lua的代码function test(str1,str2)require 'torch'require 'nn'require 'dpnn'require 'image'--print (str1)--print (str2)io.stdout:setvbuf 'no'torch.setdefaulttensortype('torch.FloatTensor')net = torch.load('/home/lyz/openface-master/models/openface/nn4.v1.t7')net:evaluate()----------------------------------------------------------------------------------local path = "/home/lyz/opencv测试/firstopencv/1.jpg"local path1 = "/home/lyz/opencv测试/firstopencv/2.jpg"local path2 = "/home/lyz/opencv测试/firstopencv/3.jpg"local PATH = {path,path1,path2} --获取路径 function stripfilename(filename) return string.match(filename, "(.+)/[^/]*%.%w+$") end --获取文件名 function strippath(filename) return string.match(filename, ".+/([^/]*%.%w+)$") end-- print (stripfilename(str1))-- print (strippath(str1))-- print (stripfilename(str2))-- print (strippath(str2)) img = torch.Tensor(1, 3, 96, 96) --定义一个空文件读取第一张图片 img[1] = image.load(str1, 3, byte) img[1] = image.scale(img[1], 96, 96) rep = net:forward(img) data = {rep} print('-------------THE FIRST IMAGE-----------------') print('---------从以下路径中读取第一张图片-----------') print (stripfilename(str1)) print('---------------图片的名称为:-----------------') print (strippath(str1)) local distance1={} --转化成table型数据格式 distance1 = data[1] print('----------特征保存为image1.txt:--------------') myFile = io.open( "image1.txt" , "w") --保存数据 -- myFile:write("-- 数据保存文件--") --myFile:write(string.char (10)) -- myFile:write(string.format("%s%s", "-- 文件创建于: ", os.date())) for i=1,128 do myFile:write(distance1[i]) myFile:write(string.char (10)) end io.close(myFile)--------------------------------------------------------------------------------- Img = torch.Tensor(1, 3, 96, 96) --定义一个空文件读取第二张图片 Img[1] = image.load(str2, 3, byte) Img[1] = image.scale(Img[1], 96, 96) rep1 = net:forward(Img) data1 = {rep1} print('**************THE SECOND IMAGE*****************') print('**********从以下路径中读取第一张图片************') print (stripfilename(str2)) print('---------------图片的名称为:-----------------') print (strippath(str2)) distance={} distance = data1[1] print('----------特征保存为image2.txt:--------------') myFile = io.open("image2.txt", "w") --保存数据 for i=1,128 do myFile:write(distance[i]) myFile:write(string.char (10)) end io.close(myFile) --------------------------------------------------------------------------------- print ('//////////////////////////////////////////////') print ('//////////////////////////////////////////////') return distance[1]end
简要介绍一下这个程序:
本程序是基于torch7 的luajit程序调用的。实现在C语言中输入了一个图片路径,在lua中调用图片路径,然后输入到网络中,计算得到128的数据,保存数据格式为TXT然后在C语言中调用,通过C语言计算来计算两个向量的欧式距离。
在liunx下最重要的是程序的编译,
//gcc -I /home/lyz/torch/install/include -L /home/lyz/torch/install/lib -lm return.c -o return /home/lyz/torch/install/lib/libluajit.so -ldl
这是一个完整的GCC编译,大家可以参考这来。主要是因为luajit是直接在torch7中依赖安装的,所以路径应该设置为luajit的安装路径。
另外我在程序中用到了math.h的sqrt()函数。所以GCC编译还需要加上
//gcc -I /home/lyz/torch/install/include -L /home/lyz/torch/install/lib -lm return.c -o return /home/lyz/torch/install/lib/libluajit.so -ldl -lm
这样才能编译通过。
贴上结果图 -------------THE FIRST IMAGE-----------------
---------从以下路径中读取第一张图片-----------
/home/lyz/opencv测试/firstopencv
---------------图片的名称为:-----------------
1.jpg
----------特征保存为image1.txt:--------------
**************THE SECOND IMAGE*****************
**********从以下路径中读取第一张图片************
/home/lyz/opencv测试/firstopencv
---------------图片的名称为:-----------------
2.jpg
----------特征保存为image2.txt:--------------
//////////////////////////////////////////////
//////////////////////////////////////////////
********两张图片的欧式距离为:**********
0.732289
- liunx 下 C/C++调用luajit
- C/C++,VS下使用luajit(环境配置)
- LuaJIT与C
- Liunx c 下signal的使用。
- liunx下c语言的编译
- 如何在liunx下编译一个调用到c语言开发的动态库(so文件)的fortran程序。
- Liunx FS / Namei.c
- C/C++中如何使用Luajit脚本
- C/C++中如何使用Luajit脚本
- LuaJit ffi 访问C中的结构体
- 在C中使用LuaJit FFI
- luajit ffi 访问C动态库
- Unix/Liunx下C/C++开发技术概览
- 通过编译luaSQL调用ODBC连接Access以及给OpenResty(LuaJIT)编写简单的C扩展示例
- liunx c/c++开发工具
- Liunx+C编程一站式学习
- liunx下(ubuntu) 怎么用eclipse写c c++?解决方案来了超级简单
- Centos下Jni调用C++,不是C
- shopnc 手机端添加自定义模块
- 算法描述
- SVN常用命令之log(查看日志)
- Linux 上的基础网络设备详解
- android studio — 百度导航demo
- liunx 下 C/C++调用luajit
- ios app 直接调用系统设置页面
- 更换jdk后,eclipse项目报错的一般解决
- Native层-OpenGL ES-双缓冲离屏渲染
- Mac终端输入密码问题
- 数据结构之二叉排序树
- nginx location 配置
- cuda+opencv的配置以及细节问题
- 动态加载布局