C++ Opencv xvid编码录像

目录

Opencv+XVID编码录像 

工业相机录像


Opencv+XVID编码录像 

参考

附件

/*
早期用Opencv打开相机进行录像的代码,可行的,太久没碰,贴上来。
*/
//(摄像头录像)//配合xvid编码器进行录像
void opencv_capture_save_x32_cp()
{
	CvCapture* capture = 0;
	CvVideoWriter* video = NULL;
	IplImage* frame = 0;
	int n;
	capture = cvCreateCameraCapture(0);
	if (!capture)
	{
		cout << "Can not open the camera." << endl;
		printf("Can not open the camera.");    //读取不成功,则标识
	}
	else
	{
		frame = cvQueryFrame(capture); //首先取得摄像头中的一帧
		const char*videoPath = "camera.avi";
		//int fourcc = CV_FOURCC('X', 'V', 'I', 'D');			//方法一:偶尔会失败——因为没有自动打开编译器
		int fourcc = -1;//用-1可以自己选择编码格式--避免编码器不打开	//方法二:人工选择——,从未失败
		video = cvCreateVideoWriter(videoPath, fourcc, 25,
			cvSize(frame->width, frame->height)); //创建CvVideoWriter对象并分配空间
		//保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32
		if (video) //如果能创建CvVideoWriter对象则表明成功
		{
			cout << "VideoWriter has created." << endl;
		}
		cvNamedWindow("Camera Video", 0); //新建一个窗口
		bool stop = false;
		while (!stop) // 
		{
			frame = cvQueryFrame(capture); //从CvCapture中获得一帧			
			if (!frame) break;
			cvShowImage("Camera Video", frame); //显示视频内容的图片
			n = cvWriteFrame(video, frame); //判断是否写入成功,如果返回的是1,表示写入成功	
			if (!n) break;
			//stop = true;//停止标志
			if (cvWaitKey(10) >= 0) break; //有其他键盘响应,则退出					
		}
	}
	cvReleaseVideoWriter(&video);
	cvReleaseCapture(&capture);
	cvDestroyWindow("Camera Video");
}
// 类型转换:IplImage*—>Mat

IplImage* iplimg = cvLoadImage("heels.jpg");

Mat matImg;

matImg = Mat(iplimg);


// 类型转换:Mat—>IplImage*

IplImage *frame;

Mat Img;

frame = &IplImage(Img); //取Mat值到指针
// 或者 *frame=IplImage(Img);

工业相机录像

#include"stdafx.h"
#include<iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;

//请用户提前配置好工程头文件目录,需要包含GalaxyIncludes.h
#include"GalaxyIncludes.h"

Mat src;

int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	IGXFactory::GetInstance().Init();
	try
	{
		do
		{
			//枚举设备
			gxdeviceinfo_vector vectorDeviceInfo;
			IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
			if (0 == vectorDeviceInfo.size())
			{
				cout << "无可用设备!" << endl;
				break;
			}
			
			//打开第一台设备以及设备下面第一个流
			CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(
				vectorDeviceInfo[0].GetSN(),
				GX_ACCESS_EXCLUSIVE);						
			
			CGXStreamPointer ObjStreamPtr = ObjDevicePtr->OpenStream(0);

			//获取远端设备属性控制器
			CGXFeatureControlPointer ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();

			//发送开采命令
			ObjStreamPtr->StartGrab();
			ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();			
			
			//主程序		
			//采单帧	
			CvCapture* capture = 0;
			CvVideoWriter* video = NULL;
			IplImage* frame = 0;
			const char*videoPath = "camera.avi";
			int n;

			bool flag = true;
			int a = 1;
			while (a)
			{
				CImageDataPointer objImageDataPtr;				

				objImageDataPtr = ObjStreamPtr->GetImage(500);//超时时间使用500ms,用户可以自行设定
				if (objImageDataPtr->GetStatus() == GX_FRAME_STATUS_SUCCESS)
				{
					//getchar();
					//采图成功而且是完整帧,可以进行图像处理...
					cout << "收到一帧图像!" << endl;
					cout << "ImageInfo: " << objImageDataPtr->GetStatus() << endl;
					cout << "ImageInfo: " << objImageDataPtr->GetWidth() << endl;
					cout << "ImageInfo: " << objImageDataPtr->GetHeight() << endl;
					cout << "ImageInfo: " << objImageDataPtr->GetPayloadSize() << endl;
					cout << objImageDataPtr->GetPixelFormat() << endl;
					cout << GX_PIXEL_FORMAT_BAYER_GR8 << endl;

					//假设原始数据是BayerRG8图像,则 GX_BIT_0_7
					void* pRGB24Buffer = NULL;				
					pRGB24Buffer = objImageDataPtr->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);				

					Mat test;
					test.create(objImageDataPtr->GetHeight(), objImageDataPtr->GetWidth(), CV_8UC3);
					memcpy(test.data, pRGB24Buffer, objImageDataPtr->GetPayloadSize() * 3);

					if (flag == true)//一次
					{
						flag = false;
						frame = &IplImage(test);

						//int fourcc = CV_FOURCC('X', 'V', 'I', 'D');			//方法一:偶尔会失败——因为没有自动打开编译器
						int fourcc = -1;//用-1可以自己选择编码格式--避免编码器不打开	//方法二:人工选择——,从未失败
						video = cvCreateVideoWriter(videoPath, fourcc, 4,
							cvSize(frame->width, frame->height)); //创建CvVideoWriter对象并分配空间
	
						if (video) //如果能创建CvVideoWriter对象则表明成功
						{
							cout << "VideoWriter has created." << endl;
						}
						cvNamedWindow("Camera Video", 0); //新建一个窗口
					}
				
					frame = &IplImage(test);
					if (!frame) break;
					cvShowImage("Camera Video", frame); //显示视频内容的图片
					n = cvWriteFrame(video, frame); //判断是否写入成功,如果返回的是1,表示写入成功	
					if (!n) break;				

					//system("pause");
					if (waitKey(20)==27)
					{
						a = 0;
						break;
					}
				}
			}

			cvReleaseVideoWriter(&video);
			cvDestroyWindow("Camera Video");
			

			//发送停采命令
			ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();
			ObjStreamPtr->StopGrab();

			//释放资源
			ObjStreamPtr->Close();
			ObjDevicePtr->Close();
		} while (false);
	}
	catch (CGalaxyException&e)
	{
		cout << "错误码: " << e.GetErrorCode() << endl;
		cout << "错误描述信息: " << e.what() << endl;
	}
	catch (std::exception&e)
	{
		cout << "错误描述信息: " << e.what() << endl;
	}

	//反初始化库
	IGXFactory::GetInstance().Uninit();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41275726/article/details/85005882