mfc多线程图像处理_mfc线程图像处理 - CSDN
  • 基本的MFC多线程

    2019-01-12 02:23:59
    多线程程序我本来是能够来写的。但是由于在图像处理的过程中,对于这方面知识使用的比较少,造成重复忘记的情况。这里再次进行整理学习,特别注重和“图像处理”理清关系,为下一步使用奠定基础。 这里实现的是工作...

          多线程程序我本来是能够来写的。但是由于在图像处理的过程中,对于这方面知识使用的比较少,造成重复忘记的情况。这里再次进行整理学习,特别注重和“图像处理”理清关系,为下一步使用奠定基础。

    这里实现的是工作者线程
    在.h文件中定义
    struct threadInfo
    {
        UINT nMilliSecond;
        CProgressCtrlpctrlProgress;
    };
    UINT ThreadFunc(LPVOID lpParam); 
    这些是需要在dlg文件外部的
    CWinThreadpThread
    在内部的。
    在.cpp文件中,实现ThreadFunc,并且将参数进行转换
    threadInfo Info
    UINT ThreadFunc(LPVOID lpParam)
    {
        threadInfopInfo=(threadInfo*)lpParam;
        for(int i=0;i<100;i++)
        {
            int nTemp=pInfo->nMilliSecond;
     
            pInfo->pctrlProgress->SetPos(i);
     
            Sleep(nTemp);
        }
        return 0;
    }
    最后在事件中进行驱动
    void CMFCApplication1Dlg::OnBnClickedButton1()
    {
        // TODO: 在此添加控件通知处理程序代码
        UpdateData(TRUE);
        Info.nMilliSecond=m_nMilliSecond;
        Info.pctrlProgress=&m_ctrlProgress;
     
        pThread=AfxBeginThread(ThreadFunc,&Info);
     
    }
    可以看到,线程的创建已经最后简化到了(函数名,参数)的形式,应该说是非常不错的。
    但是反思一下,这种机制如何在图像处理中运用了?





    展开全文
  • 多线程MFC处理视频

    千次阅读 2017-10-13 10:54:23
    在工业相机获取视频的基础上,将工业相机存储的pBuffer数据(包含了一幅图像的所有像素点数据,数据存储规律为B0G0R0,B1G1R1……先行后列)转换成为Mat类图像,因而,可以在OPENCV中进行图像处理。程序如下: void ...

    由于之前在做ALLIED TECNOLOGY工业相机,在工业相机获取视频的基础上,将工业相机存储的pBuffer数据(包含了一幅图像的所有像素点数据,数据存储规律为B0G0R0,B1G1R1……先行后列)转换成为Mat类图像,因而,可以在OPENCV中进行图像处理。程序如下:

    void CopyToMat(Mat* img, VmbUchar_t*pInBuffer)//自定义  pBffer即为工业相机获取到的图像数据容器
    {
     for (int i = 0; i<(*img).rows; i++)
     {
      for (int j = 0; j < (*img).cols; j++)
      {
       ((*img).ptr<uchar>(i,j))[0] = *(pInBuffer  +i*(*img).cols*3 + (j * 3) + 0);
       ((*img).ptr<uchar>(i,j))[1] = *(pInBuffer  +i*(*img).cols * 3 + (j * 3) + 1);
       ((*img).ptr<uchar>(i,j))[2] = *(pInBuffer  +i*(*img).cols * 3 + (j * 3) + 2);
      }
     }
    }

     

         由于有很多大型算法进行图像处理,所以要解决视频丢帧问题,因而需要用多线程来解决视频丢帧问题。

         思路是:用定时器来不断的获取图像,然后立即向队列里缓存图像,然后再开一个线程来不断的从队列的头部取出,在从线程中进行图像处理。

         添加定时器的方法是 添加一个定时器消息。

          定时器的初始化是: SetTimer(1,300,NULL);//300ms

         定义一个结构体来存储图像(这个结构体的作用是将图像存储到结构体里,然后再从结构体传递给队列,个人理解)。结构体定义如下:

    struct DataInfo
    {
    Mat pBuf;//缓存内容
    int iSize;//缓存大小


    DataInfo()
    {
    pBuf = NULL;
    iSize = 0;
    }
    };

    定义一个函数,用队列来存储图像。如下:

     void ImgBuffer(Mat image)
     {
    if (hthread1 == NULL)
    {
    hthread1 = CreateThread(NULL, 0, thread_work, &image, 0, NULL);
    InitializeCriticalSection(&m_lock);//线程锁初始化
    }
    else
    {
    DataInfo dataInfo;
    dataInfo.pBuf = image;
    EnterCriticalSection(&m_lock);//进入临界区
    m_dq_buf.push(dataInfo);//把图像压入队列
    LeaveCriticalSection(&m_lock);//退出临界区
    }
     }

    定义线程函数,从队列中取出来图像进行图像处理。函数如下:


     DWORD WINAPI thread_work(LPVOID IpParmeter)
     {
    //当缓存队列中的数据大于0时,不断将数据取出进行处理
    DataInfo dataInfo;//定义一个临时变量

    while (1) {
    if (m_dq_buf.size() > 0)
    {
    dataInfo  = m_dq_buf.front();//从队列中取得第一幅图像

    Mat imgGray, imgHarris, harrisCorner;
    cvtColor(dataInfo.pBuf, imgGray, CV_BGR2GRAY);//将彩色图像转换为灰度图
    cornerHarris(imgGray, imgHarris, 2, 3, 0.001);//角点检测
    threshold(imgHarris, harrisCorner, 0.00001, 255, THRESH_BINARY);//图像二值化
    imshow("线程读取结果", dataInfo.pBuf);
    imshow("角点检测", harrisCorner);



    //使用临界区加锁
    EnterCriticalSection(&m_lock);//进入临界区
    m_dq_buf.pop();//将缓存从队列中删除
    LeaveCriticalSection(&m_lock);//退出临界区
    }
    Sleep(500);//休眠500ms,也就是每隔500ms从队列中取一次图像进行处理
    }
     }


    遇到的问题:

    1.如果不在初始化函数中添加

    namedWindow("线程读取结果", WINDOW_AUTOSIZE);//若不初始化窗口,则会在主线程所创建的从线程中,图片显示灰色
    namedWindow("角点检测", WINDOW_AUTOSIZE);//同上

    则会出现窗口为灰色。

    2.线程函数应该是一个死循环。


    PS.我是做视觉的,某人是做飞控的,这个程序是某人帮我调出来的,结果他竟然说感觉他也就能帮我到这里了,后面的都要我自己来了。

    展开全文
  • https://blog.csdn.net/hu2703411/article/details/49910889
    https://blog.csdn.net/hu2703411/article/details/49910889
    展开全文
  • MFC编程中开始学习都是只利用一个主线程,比较蛋疼的是,当你只用一个主线程进行如播放,查询时,MFC的界面会卡死,你无法进行其他的操作,这时需要进行多线程的编程,在操作时生成一个子线程来进行一些如播放,...

    在MFC编程中开始学习都是只利用一个主线程,比较蛋疼的是,当你只用一个主线程进行如播放,查询时,MFC的界面会卡死,你无法进行其他的操作,这时需要进行多线程的编程,在操作时生成一个子线程来进行一些如播放,查询等的费时的操作。
    多线程,经常会与对实时性要求比较高的并行运算结合,用来隐藏数据传输过程中用到的等待时间。
    基于MFC的多线程在上一篇博客的基础上进行改进:
    1.简单建立如下的界面:
    这里写图片描述
    2给各个控制按键添加消息响应函数:
    主要是对播放按钮填加函数使在点击按钮时生成一个子线程来播放图片:

            zhanting=0;
            hThread=CreateThread(NULL,
            0,
            (LPTHREAD_START_ROUTINE)ThreadFunc,
            NULL,
            0,
            &ThreadID);
            GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
            GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
            GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);

    通过调用CreateThread()函数来生成一个子线程;
    在Dlg.h中声明句柄:

        HANDLE hThread;
        DWORD ThreadID;

    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
    GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
    GetDlgItem(IDC_CONTIUN)->EnableWindow(FALSE);
    为设置当按键被按下时其他各个框是否可被按下
    下面是生成线程函数的代码:

        IplImage *image=NULL; //原始图像
        char filename[128];
        m_bRun=true;
        if(zhanting==0)
            i=2;
        else
        {
            i=weizhi;
        }
        for(;i<300;i++)
        {   
            UINT ID;
            ID=IDC_PICTURE;
            sprintf(filename,"5//%d.jpg",i);
            //if(image) 
            //  cvReleaseImage(&image);
            image = cvLoadImage(filename); //显示图片
            cvWaitKey(3);
            //DrawPicToHDC(image, IDC_Picture);
            //  CPicturesDlg.DrawPicToHDC(image, IDC_Picture);
            CDuoxiancDlg* pMainWnd=(CDuoxiancDlg*)AfxGetMainWnd();
            CDC *pDC = (CDC*)pMainWnd->GetDlgItem(ID)->GetDC();
            HDC hDC= pDC->GetSafeHdc();
            CRect rect;
            pMainWnd->GetDlgItem(ID)->GetClientRect(&rect);
            CvvImage cimg;
            cimg.CopyOf(image);
            cimg.DrawToHDC(hDC,&rect);
            pMainWnd->ReleaseDC(pDC);
            Sleep(30);
            cvReleaseImage(&image);
            if(!m_bRun)
            {
                weizhi=i;
                break;
            }
        }

    由于生成子线程函数不继承Dlg类,所以要用声明一个Dlg类pMainWnd
    由于这里还没有与数据库连接,直接在文件夹中放图片进行读取;
    线程之间的通信,这里只是简单地定义了全局变量

    volatile BOOL m_bRun;
    volatile int weizhi;
    volatile int i;
    volatile int zhanting=0;
    

    其他两个按钮的功能通过改变全局变量来控制播放的暂停继续。
    这里写图片描述
    如果你是魔女,我只要化身魔王就可以了…..

    展开全文
  • MFC+多线程+参数传递

    千次阅读 2017-10-10 19:50:15
    用VS2013+MFC编程,在做数据加载处理过程中经常需要多线程,否则程序容易卡死。首先windows多线程可以分为UI多线程处理多线程:UI多线程继承来自CWinThread类,主要作用是创建UI界面;这里主要讲后台数据处理多...
  • 本博客主要总结如何利用MFC多线程+Opencv打开多摄像头函数,具体的步骤如下所示。 1.1首先创建一个MFC基本对话框工程,在对话框界面添加一个按钮,双击该按钮,在按钮事件处理函数OnBnClickedButtonTest()中,添加...
  • 图像采集及处理多线程编程

    千次阅读 2017-07-15 22:32:15
    本文介绍MFC中图像采集及图像处理多线程编方法。创建了三个线程,分别为图像采集、图像处理及图像显示线程。线程之间的共享数据有保存的图像链表和图像处理结果存储结构。
  • 一篇关于图像采集的文章
  • 多线程调用 opencv 图像处理

    千次阅读 2019-06-06 11:56:26
    调用相机视频进行实时处理,原本是基于c++ 的线程池实现的,后来编译成 dll,转用 c# 的线程池实现,Dll 里面的图像处理过程还是比较的,但是经常会出现 dll 中内存地址访问冲突,通常是程序跑了一段时间之后。...
  • MFC多线程操作

    2019-09-26 14:29:59
    记得用MFC做了一个图像自动修复软件,当时没有多线程操作这一概念,由于图像修复算法比较复杂,因此,当执行图像修复时,程序就像卡死了似得而不能做其他操作。其实MFC对这种情况有一种很好地解决方案,那就是采用...
  • MFC 多线程 用户界面线程创建

    千次阅读 2014-07-31 21:16:15
    用户界面线程的AfxBeginThread的原型如下: CWinThread* AFXAPI AfxBeginThread(  CRuntimeClass* pThreadClass,  int nPriority,  UINT nStackSize,  DWORD dwCreateFlags,  LPSECURITY_ATTRIBUTES ...
  • MFC中利用多线程实现opencv视频窗口多画面 效果图如上所示,在vc6.0+opencv1.0环境下实现。虽然现在opencv出2.0了,但是不再支持vc6.0了,做这个例子当是跟vc6.0告个别了。呵呵 详细内容,往后会写上去的。...
  • 在最近的一个工程中,涉及到大量的图像处理的计算,当进行图像处理时程序界面会显示未响应。由于正在处理计算,程序使用的是单线程,因此无法进行其他操作。 考虑使用多线程运算,将计算的部分放入新的线程中。在此...
  • 一、创建线程:不使用公司库 一、创建线程:使用公司库 1、再类里面的成员函数里面创建线程 2、线程里面模拟按键检测 一、创建线程:不使用公司库 MFC头文件中编写:分文件类外定义的数据或者创建全局变量 ...
  • 多线程并发处理

    2012-08-02 17:30:09
    问题:在两路或三路同时回放同一个文件夹下的BMP图像时,由于两个或三个线程同时访问相同的数据而引发冲突,使线程意外终止。 解决方法:利用MFC提供的同步类和同步访问类。 同步类:CSyncObject, CSemaphore, ...
  • void CroadvisionDlg::OnButtonOpen() ... // TODO: 在此添加控件通知处理程序代码 //CFileDialog *dlgopen=new CFileDialog(true,"*.avi",NULL,NULL,"*.avi|*.avi||"); CFileDialog *dlgopen=new CFileDialog(true);
  • 今天刚好看到了Qt多线程,就写了个小例子放出来,希望能帮到跟我一样的初学者。 简单讲下。程序就两个界面。一个主要的QDialog,一个显示图像的自定义控件MyPicBox 。还有就是动态创建了一个QMainWindow,因为我...
1 2 3 4 5 ... 20
收藏数 3,744
精华内容 1,497
关键字:

mfc多线程图像处理