天天看点

如何生成excel文件作为图像识别结果

如何生成excel文件作为图像识别结果

在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观。这个时候,选择excel作为结果输出文件,将是合适的。

查询相关资料,有很多关于excel的操作方法,但是使用mfc来进行excel的操作,总是要涉及到很多东西。

一、采用csv方式

实验如下:

创建1.csv文件,使用记事本进行编辑

如何生成excel文件作为图像识别结果

而后使用excel进行打开

如何生成excel文件作为图像识别结果

效果很好。而csv的操作是可以直接采用文本编辑的方式生成的,可以直接采用std:file操作的方法来生成csv文件,然后使用excel打开就可以。

再附上一段代码,是opencv官方提供的csv操作相关的,可以参考

//创建或续写目录下的csv文件,填写“文件位置-分类”对

    int writeCsv(const string& filename,const Vector<pair<string,string>>srcVect,char separator ){

        ofstream file(filename.c_str(),ofstream::app);

        if (!file)

            return 0;

        for (int i=0;i<srcVect.size();i++){

            file<<srcVect[i].first<<separator<<srcVect[i].second<<endl;

        }

        return srcVect.size();

    }

    //读取目录下的csv文件,获得“文件位置-分类”对

    vector<pair<string,string>> readCsv(const string& filename, char separator) {

        pair<string,string> apair;

        string line, path, classlabel;

        vector<pair<string,string>> retVect;

        ifstream file(filename.c_str(), ifstream::in);

        if (!file) 

            return retVect;

        while (getline(file, line)) {

            stringstream liness(line);

            getline(liness, path, separator);

            getline(liness, classlabel);

            if(!path.empty() && !classlabel.empty()) {

                apair.first = path;

                apair.second = classlabel;

                retVect.push_back(apair);

            }

        return retVect;

二、采用xls方式

涉及到的东西比较多,现在已经集成到了GOcvHelper中去

#pragma region 

    //////////////////////////////////////////////////////////////////////////////

    //名称:GetExcelDriver

    //功能:获取ODBC中Excel驱动

    //作者:徐景周([email protected])

    //组织:未来工作室(Future Studio)

    //日期:2002.9.1

    /////////////////////////////////////////////////////////////////////////////

    CString GetExcelDriver()

    {

        char szBuf[2001];

        WORD cbBufMax = 2000;

        WORD cbBufOut;

        char *pszBuf = szBuf;

        CString sDriver;

        // 获取已安装驱动的名称(涵数在odbcinst.h里)

        if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))

            return "";

        // 检索已安装的驱动是否有Excel...

        do

        {

            if (strstr(pszBuf, "Excel") != 0)

            {

                //发现 !

                sDriver = CString(pszBuf);

                break;

            pszBuf = strchr(pszBuf, '\0') + 1;

        while (pszBuf[1] != '\0');

        return sDriver;

    ///////////////////////////////////////////////////////////////////////////////

    //    BOOL MakeSurePathExists( CString &Path,bool FilenameIncluded)

    //    参数:

    //        Path                路径

    //        FilenameIncluded    路径是否包含文件名

    //    返回值:

    //        文件是否存在

    //    说明:

    //        判断Path文件(FilenameIncluded=true)是否存在,存在返回TURE,不存在返回FALSE

    //        自动创建目录

    //

    BOOL MakeSurePathExists( CString &Path,

        bool FilenameIncluded)

        int Pos=0;

        while((Pos=Path.Find('\\',Pos+1))!=-1)

            CreateDirectory(Path.Left(Pos),NULL);

        if(!FilenameIncluded)

            CreateDirectory(Path,NULL);

        //    return ((!FilenameIncluded)?!_access(Path,0):

        //    !_access(Path.Left(Path.ReverseFind('\\')),0));

        return !_access(Path,0);

    //获得默认的文件名

    BOOL GetDefaultXlsFileName(CString& sExcelFile)

        ///默认文件名:yyyymmddhhmmss.xls

        CString timeStr;

        CTime day;

        day=CTime::GetCurrentTime();

        int filenameday,filenamemonth,filenameyear,filehour,filemin,filesec;

        filenameday=day.GetDay();//dd

        filenamemonth=day.GetMonth();//mm月份

        filenameyear=day.GetYear();//yyyy

        filehour=day.GetHour();//hh

        filemin=day.GetMinute();//mm分钟

        filesec=day.GetSecond();//ss

        timeStr.Format("%04d%02d%02d%02d%02d%02d",filenameyear,filenamemonth,filenameday,filehour,filemin,filesec);

        sExcelFile =  timeStr + ".xls"; //获取随机时间的文件名称

        //打开选择路径窗口

        CString pathName; 

        CString defaultDir = _T("C:\\outtest");

        CString fileName=sExcelFile;

        CString szFilters= _T("xls(*.xls)");

        CFileDialog dlg(FALSE,defaultDir,fileName,OFN_HIDEREADONLY|OFN_READONLY,szFilters,NULL);

        if(dlg.DoModal()==IDOK){

            //获得保存位置

            pathName = dlg.GetPathName();

        sExcelFile = pathName;

        return TRUE;

    //    void GetExcelDriver(CListCtrl* pList, CString strTitle)

    //        pList        需要导出的List控件指针

    //        strTitle    导出的数据表标题

    //        导出CListCtrl控件的全部数据到Excel文件。Excel文件名由用户通过“另存为”

    //        对话框输入指定。创建名为strTitle的工作表,将List控件内的所有数据(包括

    //        列名和数据项)以文本的形式保存到Excel工作表中。保持行列关系。

    //    

    //    edit by [r]@dotlive.cnblogs.com

    CString ExportListToExcel(CListCtrl* pList, CString strTitle)

        CString warningStr;

        if (pList->GetItemCount ()>0) {    

            CDatabase database;

            CString sDriver;

            CString sExcelFile; 

            CString sSql;

            CString tableName = strTitle;

            // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 

            sDriver = GetExcelDriver();

            if (sDriver.IsEmpty())

                // 没有发现Excel驱动

                AfxMessageBox("没有安装Excel!\n请先安装Excel软件才能使用导出功能!");

                return NULL;

            ///默认文件名

            if (!GetDefaultXlsFileName(sExcelFile))

            // 创建进行存取的字符串

            sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);

            // 创建数据库 (既Excel表格文件)

            if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )

                // 创建表结构

                int i;

                LVCOLUMN columnData;

                CString columnName;

                int columnNum = 0;

                CString strH;

                CString strV;

                sSql = "";

                strH = "";

                columnData.mask = LVCF_TEXT;

                columnData.cchTextMax =100;

                columnData.pszText = columnName.GetBuffer (100);

                for(i=0;pList->GetColumn(i,&columnData);i++)

                {

                    if (i!=0)

                    {

                        sSql = sSql + ", " ;

                        strH = strH + ", " ;

                    }

                    sSql = sSql + " " + columnData.pszText +" TEXT";

                    strH = strH + " " + columnData.pszText +" ";

                }

                columnName.ReleaseBuffer ();

                columnNum = i;

                sSql = "CREATE TABLE " + tableName + " ( " + sSql +  " ) ";

                database.ExecuteSQL(sSql);

                // 插入数据项

                int nItemIndex;

                for (nItemIndex=0;nItemIndex<pList->GetItemCount ();nItemIndex++){

                    strV = "";

                    for(i=0;i<columnNum;i++)

                        if (i!=0)

                        {

                            strV = strV + ", " ;

                        }

                        strV = strV + " '" + pList->GetItemText(nItemIndex,i) +"' ";

                    sSql = "INSERT INTO "+ tableName 

                        +" ("+ strH + ")"

                        +" VALUES("+ strV + ")";

                    database.ExecuteSQL(sSql);

            }      

            // 关闭数据库

            database.Close();

            warningStr.Format("导出文件保存于%s!",sExcelFile);

            AfxMessageBox(warningStr);

            return sExcelFile;

#pragma endregion

使用的时候,直接生成gridview,然后调用就可以

CString cstresult =  ExportListToExcel(&m_MyListCtrl,"中药识别结果");

来自为知笔记(Wiz)

目前方向:图像拼接融合、图像识别

联系方式:[email protected]