人脸识别--MFC下调用caffe做人脸识别

来源:互联网 发布:Java存储多条记录 编辑:程序博客网 时间:2024/06/09 18:41

        准备做一个简单的人脸识别工程项目,选了MFC来做,不知道为什么在控制台程序下运行没有报错,到了MFC下面就会报很多看不懂的错。心酸。。。

        对此,我的解决方法是,简单粗暴,在MFC中调用可执行程序,这个可执行程序就是调用caffe的控制台程序,把输出写到文件中,MFC程序在这个可执行程序执行完之后,读文件,就可得到caffe输出的信息。说起来很绕,其实代码也就几行而已。

       

//获取图片的特征向量//调用可执行程序hProg = ShellExecute(NULL, _T("open"), _T("C:\\Users\\ze\\Desktop\\毕业设计\\GetVectorProject\\x64\\Release\\ConsoleApplication16.exe"), NULL, NULL, SW_HIDE);WaitForSingleObject(hProg, INFINITE);//从文件中获取特征向量while (!file.Open(_T("C:\\Users\\ze\\Desktop\\Picture_Change_Contents\\result.dat"), CFile::modeRead));file.Read(test, sizeof(test));file.Close();//获取数据后,删除特征向量的文件file3.Remove(_T("C:\\Users\\ze\\Desktop\\Picture_Change_Contents\\result.dat"));
       这里使用的是ShellExecute()函数,函数原型是HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory,INT nShowCmd); 

      参数说明:

     hwnd:       用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。

    lpOperation:      用于指定要进行的操作。有以下几个参数值可供选择。
            “open”操作表示执行由lpFile参数指定的程序,或打开由lpFile参数指定的文件或文件夹;
            “print”操作表示打印由lpFile参数指定的文件;
            “explore”操作表示浏览由lpFile参数指定的文件夹。
             当参数设为NULL时,表示执行默认操作“open”。 

    lpFile:     用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
    lpParameters:    若lpFile参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为NULL.
    lpDirectory:  用于指定默认目录.
    nShowCmd:  若lpFile参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。

     这个参数常用的常数:
        SW_HIDE 隐藏窗口,活动状态给令一个窗口
        SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
        SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同
若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。 

      另外,因为ShellExecute()是一个异步执行函数,在开辟一个新的线程,执行调用函数的同时,主函数会继续向下执行。这显然不是我想要的,主函数还需要等待线程函数的输出呢。用WaitForSingleObject()函数,函数用两个参数,第一个参数是可执行程序的句柄,第二个参数是指等待的时间,以毫秒为单位,常数值INFINITE代表无限时间等待。

      好了,这样貌似就可以了。但是,线程真的就安全了吗?然而,并没有。后来,我查了下,应该是控制台程序最后将输出写到文件之中,好像是程序虽然结束了,但是写文件的操作还没有结束,导致有时候读取不到正确的输出。所以,主函数可以每次等候调用函数的写操作完毕。就是判断打开文件是否成功。

     我不知道MFC下怎么完成caffe的调用,所以搞出来这么一个曲线救国(蛋疼无比)的方法。。。。



0 0
原创粉丝点击