现在有一个利用opencv2版本的图像识别案例,由于案例是在控制台运行的,现在希望改到MFC界面下运行和显示,求大神指点下,感激不尽。利用opencv对图片中矩形图形进行识别和剪切,(下载
以vs2013做好的MFC界面一个(下载),求大神帮忙看看,咋将上方的案例应用到这里或者,随便建立一个MFC的demo,将上方的案例应用上去也行,求大神指点,感激不尽此外,将我做过的尝试列出如下:
调试运行后,出错,尝试无门,求指点

解决方案 »

  1.   

    不要做A语言代码修改为B语言代码的无用功。
    也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
    只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
    即可很方便地让A、B两种语言之间协调工作。
    比如:
    A将请求数据写到文件a.txt,写完后改名为aa.txt
    B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
    A发现bb.txt存在时,读取其内容,读完后删除bb.txt
    以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
    除非A或B不支持判断文件是否存在、文件读写和文件更名。
    但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
    可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
    数据的结构很复杂的话,文本文件的格式问题可参考json或xml共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
    ·进程之间松耦合
    ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
    ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
    ·方便在线开关服务,只需删除或创建该临时文本文件即可。
    ·方便实现分布式和负载均衡。
    ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
    ·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
    回头是“使用共享纯文本文件进行信息交流”的岸!
      

  2.   

    opencv也用c++呀,只是这个案例有些复杂,看不懂怎么才能调用到MFC上,特别是案例中定义了一个结构体,完全不知道咋搞
      

  3.   

    1、opencv关注的是图像处理,图像处理算法无论是控制台还是MFC是一样的
    2、使用Mat对象缺省配置,其图片的格式和窗口位图的排列方式一样,你可以直接拷贝到一个DIB里
    3、唯一不同的是OpenCV没有4字节对齐,而DIB要求要4字节对齐
    4、你也可以在MFC程序中直接调用imshow直接显示,只是imshow会创建一个弹出窗口
      

  4.   

    你需要的只是一个drawMattoHdc方法,发一个以前网上找的。
    void MatToCImage(Mat &mat, CImage &img)
    {
    if (!mat.data)
    return;
    int nBPP = mat.channels() * 8;
    img.Destroy();
    img.Create(mat.cols, mat.rows, nBPP);
    if (nBPP == 8)
    {
    static RGBQUAD pRGB[256];
    for (int i = 0; i < 256; i++)
    pRGB[i].rgbBlue = pRGB[i].rgbGreen = pRGB[i].rgbRed = i;
    img.SetColorTable(0, 256, pRGB);
    }
    uchar* psrc = mat.data;
    uchar* pdst = (uchar*)img.GetBits();
    int imgPitch = img.GetPitch();
    for (int y = 0; y < mat.rows; y++)
    {
    memcpy(pdst, psrc, mat.cols*mat.channels());//mat->step is incorrect for those images created by roi (sub-images!)
    psrc += mat.step;
    pdst += imgPitch;
    }
    }
    //使用如下:
    Mat mt = imread();
    CImage img;
    MatToCimage(mt,img);
    HBITMAP hbmp = img.Detach(); 
      

  5.   

    @worldy 
    对的,主要图像识别主要还是算法的问题,但他这个案例的算法,看不懂,只是实验后,发现做到自己想要的效果了,才想着取巧,试试能不能先拿过来用。它这个算法里边,定义了一个结构体Line,然后定义的方法里还有应用了这个结构体的参数,在MFC下由于以前没搞过,就不知道怎么才处理好,把案例源码完整的拿过来先用
    @evionmzs
    你这个是不是将Mat图片转成HDC?我在图片处理后用CvvImage类貌似也是差不多的效果?感谢指点
      

  6.   

    不好意思,不是很明白你的问题,不过我觉得,把这个程序整合到mfc,除了界面显示外,其它的方法,都可以用opencv里面的函数。
    我现在的程序,也是这么做的,除了显示外,其它地方都用的opencv,
    你的意思是,把算法那里改成c++里面的方法?
      

  7.   

     基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
    编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择;在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的。
          基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架。具有以下特点:
          1、基于directshow,兼容性好,速度快。到目前为止,无论是工业相机还是普通相机,没发现不兼容的;
          2、摄像头部分通过线程读取,保证界面的运行流畅;
          3、框架经过多次打磨,已经比较稳定,不会出现异常错误;代码简洁明了,方便复用。
      

  8.   

    你不是一个知识点没解决,所以你需要的是去发一个外包,CSTO上有发外包的,好像去年底就不行了,你可以去试下运气