opencv 拍摄照片

opencv 拍摄照片

flyfish

环境 MFC opencv版本3

使用了 老版本的文件的CvvImage.h,CvvImage.cpp添加到现有项目
主要将视频显示到MFC的Picture Control中

头文件

    bool m_bIsStop;//关闭摄像头
    afx_msg void OnClose(); //窗口关闭 关闭摄像头
    bool m_bIsTakePicture;//是否拍照
    void DoEvent();//防止无响应
       void showImage(cv::Mat& src, UINT ID);

实现文件
初始
标志变量m_bIsStop,m_bIsTakePicture初始化都为false

void CDlgX::showImage(cv::Mat& src, UINT ID)//显示视频帧
{
    if (m_bIsStop)
    {
        return;
    }

        if (src.empty())
            return;
        CRect rect;
        cv::Mat dst = src.clone();
        GetDlgItem(ID)->GetClientRect(&rect);   
        if (dst.channels() == 1)
            cv::cvtColor(dst, dst, CV_GRAY2BGR);
        CDC* pDC = GetDlgItem(ID)->GetDC();
        HDC hDC = pDC->GetSafeHdc();                
        CvvImage cimg;
        IplImage cpy = dst;
        cimg.CopyOf(&cpy);                      
        cimg.DrawToHDC(hDC, &rect);             
        ReleaseDC(pDC);

}

void CDlgX::OnBnClickedButtonTakeapicture()//拍照
{
    m_bIsTakePicture = true;    
}

void CDlgX::OnBnClickedButtonOpen()//打开摄像头
{
    // TODO:  在此添加控件通知处理程序代码

    cv::VideoCapture capture;
    capture.open(0);
    if (!capture.isOpened())
    {
        return;
    }


    cv::Mat frame;

    m_bIsStop = false;
    while (true)
    {

        DoEvent();
        if (m_bIsStop)
        {
            break;
        }

        capture >> frame;
        if (m_bIsTakePicture)
        {

            cv::imwrite("D:\\temp\\1.jpg", frame);
            Sleep(1000);
            m_bIsTakePicture = false;

        }
        showImage(frame, IDC_STATIC_CAMERA);

    }
    capture.release();

}


void CDlgX::OnClose()
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    m_bIsStop = true;
    CDialogEx::OnClose();
}
void CDlgX::DoEvent()//防止无响应
{
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

你可能感兴趣的:(VC++,MFC)