#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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)