目录
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;
}