vc6.0利用opencv1.0实现在picture控件里面显示摄像头视频的问题

vc6.0利用opencv1.0实现在picture控件里面显示摄像头视频的问题,第1张

#include "CvvImage.h"

#include <highgui.h>

#include <cv.h>

IplImage * g_Frame//用于存储一帧

CvvImageg_CvvImage

CvCapture * g_Video

CRect g_Rect

boolg_bRun = true

DWORD WINAPI ThreadFun(LPVOID lParam)

{

xxxDlg* dlg = (xxxDlg*)lParam

CDC* pDC

HDC hdc

CWnd *pwnd

while( g_bRun )

{

g_Frame = cvQueryFrame( g_Video )

pwnd= dlg->GetDlgItem(IDC_STATIC)//PIC控件

pDC=pwnd->GetDC()

hdc=pDC->GetSafeHdc()

pwnd->GetClientRect(&g_Rect)

g_CvvImage.CopyOf( g_Frame, 1 )//g_CvvImage是CvvImage类型

g_CvvImage.DrawToHDC( hdc, &g_Rect )

dlg->ReleaseDC( pDC )

}

return 0

}

BOOL xxxDlg::OnInitDialog()

{

..

//打开摄像头

g_Video = cvCreateCameraCapture( -1 )

if ( !g_Video )

{

AfxMessageBox( "无法打开摄像头" )

return FALSE

}

//创建一个线程

CreateThread( NULL, 0, ThreadFun, this, 0, NULL )

}

//最后记得释放

void xxxDlg::OnDestroy()

{

CDialog::OnDestroy()

// TODO: 在此处添加消息处理程序代码

g_bRun = false

cvReleaseCapture( &g_Video )

}

额,这个顺序正好搞反了,应该是先Create一个FileCapture,然后再cvSetCaptureProperty。

你的g_capture应该先赋值才能对其属性进行设置啊,否则你设置的是谁呢

#include <cv.h>#include <highgui.h>int main(int argc, char **argv)

{

    CvCapture* capture = NULL

    capture = cvCreateFileCapture("红动中国设计网视频素材2185.avi")    if (!capture) return -1    //获取视频的第一帧 并存在bgr_frame

    IplImage *bgr_frame = cvQueryFrame(capture)    //获得视频的总帧数 CV_CAP_PROP_FPS 帧率

    double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS) 

    //获得原始视频的高度和宽度

    CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),

        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT))    ///创建一个视频文件参数分别表示  新建视频的名称 视频压缩的编码格式 新建视频的帧率 新建视频的图像大小

    CvVideoWriter *writer = cvCreateVideoWriter("1ai.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size)    //创建首地址 并分配存储空间

    IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 3)    // 获取视频的下一帧

    while ((bgr_frame = cvQueryFrame(capture)) != NULL)

    {        //将视频从笛卡尔坐标系转到极坐标系 参数分别表示 输入图像 输出图像 变换中心 尺度参数 填充输出图像所有参数 + CV_INTER_LINEAR 表示双线性参值(具体什么意思)

        cvLogPolar(bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width / 2, bgr_frame->height / 2), 80, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS)        //将获取到的每一帧从笛卡尔坐标系转到极坐标系后的参数 存到新建的视频文件        cvWriteFrame(writer, logpolar_frame)        //将获取的视频通过mainwin窗口进行展示

        cvShowImage("mainwin", logpolar_frame)        char c = cvWaitKey(33)        //ESC 默认退出

        if (c == 27) break

    }    //释放程序中申请的空间

    cvReleaseVideoWriter(&writer)

    cvReleaseImage(&logpolar_frame)

    cvReleaseCapture(&capture)    return(0)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11698118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存