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


0 0