第二章 opencv入门
主函数
#include <opencv2opencv.hpp>
using namespace cv;
int main(int argc, char ** argv);
void showImage();
void playVideo();
void onTrackbarSlide(int pos);
void controlVideo();
void simpleChange();
void doPydown();
void doCanny();
void videoCapture();
void writeVideo();
//加载并在屏幕上显示一幅图像
int main(int argc,char** argv)
{
//显示图像
//showImage();
//播放avi视频
//playVideo();
//控制视频
//controlVideo();
//一个简单的变换
//simpleChange();
// 一个复杂的变换
//doPydown();
//边缘检测
//doCanny();
//从摄像机读取数据
//videoCapture();
//写入avi视频
writeVideo();
}
显示图像
/**
*显示图像
**/
void showImage() {
//Mat picture = imread("test.jpg");//要和main.cpp文件放在一个文件夹下 //
//imshow("测试程序", picture);
//waitKey(0);
//图像加载到内存
//IplImage * img=cvLoadImage(argv[1]);
//直接打开本地图像
IplImage * img = cvLoadImage("test.jpg");
//在屏幕上创建一个窗口
cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);
//显示图像
cvShowImage("Example1", img);
//等待用户按键操作
waitKey(0);
//释放内存
cvReleaseImage(&img);
//销毁窗口
cvDestroyWindow("Example1");
}
播放avi视频
/*
播放avi视频
*/
void playVideo() {
//创建一个窗口
cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
//返回的catpure指针,指向avi文件的开头,分配内存
CvCapture* capture = cvCreateFileCapture("output.avi");
//分配一帧
IplImage* frame;
while (true)
{
//将下一帧载入内存
frame = cvQueryFrame(capture);
if (!frame)break;
cvShowImage("Example2", frame);
//等待33秒,实际应用中可以从capture中读取实际帧率
char c=cvWaitKey(33);
if (c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}
视频播放控制
//全局变量,位置
int g_slider_position = 0;
//CvCapture 结构体
CvCapture* g_capture = NULL;
/*
控制播放视频
*/
void controlVideo() {
//创建窗体
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
//读放avi文件
g_capture = cvCreateFileCapture("output.avi");
//从capture查询数据,帧数为0时,滚动条不会视创建
int frames = cvGetCaptureProperty(
g_capture,
//视频文件总帧数
CV_CAP_PROP_FRAME_COUNT
);
if (frames!=0)
{
cvCreateTrackbar(
"Position",
"Example3",
//位置
&g_slider_position,
//
frames,
//回调函数
onTrackbarSlide
);
}
IplImage* frame;
while (true)
{
//将下一帧载入内存
frame = cvQueryFrame(g_capture);
if (!frame)break;
cvShowImage("Example3", frame);
//等待33秒,实际应用中可以从capture中读取实际帧率
char c = cvWaitKey(33);
if (c == 27)
{
break;
}
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
}
/*
回调函数,参数为位置
*/
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(
g_capture,
//以帧数来设置位置
//如果想以视频的长度比例来设置,可以使用CV_CAP_PROP_POS_AVI_RATIO
CV_CAP_PROP_POS_FRAMES,
pos
);
}
一个简单的变换
/*
一个简单的变换, 对一幅图像作平滑处理
*/
void simpleChange() {
//直接打开本地图像
IplImage * img = cvLoadImage("test.jpg");
//创建窗体原始图像
cvNamedWindow("Example4_in");
//创建窗体处理后图像
cvNamedWindow("Example4_out");
//显示图像
cvShowImage("Example4_in", img);
//创建一张图像,用作处理后显示
IplImage* out = cvCreateImage(
cvGetSize(img),//图像结构大小
IPL_DEPTH_8U,//每个像素点的数据类型
3 //通道数
);
//每个像素3*3区域平滑处理
cvSmooth(img,out,CV_GAUSSIAN,3,3);
//显示图像
cvShowImage("Example4_out",out);
//释放图像
cvReleaseImage(&out);
cvWaitKey(0);
cvDestroyWindow("Example4_in");
cvDestroyWindow("Example4_out");
}
/*
一个复杂的变换,显示图像的一半
*/
void showHalf() {
//直接打开本地图像
IplImage * img = cvLoadImage("test.jpg");
//assert(img->width%2==0 && img->height%2==0);
IplImage* out = cvCreateImage(//从旧的图像中读取信息
CvSize(img->width/2,img->height/2),
img->depth,
img->nChannels
);
cvPyrDown(img,out);
//在屏幕上创建一个窗口
cvNamedWindow("Example5", CV_WINDOW_AUTOSIZE);
//显示图像
cvShowImage("Example5", out);
//等待用户按键操作
waitKey(0);
//释放内存
cvReleaseImage(&out);
//销毁窗口
cvDestroyWindow("Example5");
}
/*
边缘检测输出一个单通道图像
*/
void doCanny() {
//直接打开本地图像
IplImage * img = cvLoadImage("test.jpg");
double lowThresh = 5;
double highThresh = 20;
double aperture = 3;
if (img->nChannels!=1)
{
return;
}
IplImage* out = cvCreateImage(
CvSize(cvGetSize(img)),
IPL_DEPTH_8U,
1
);
cvCanny(img, out, lowThresh, highThresh,aperture);
//在屏幕上创建一个窗口
cvNamedWindow("Example6", CV_WINDOW_AUTOSIZE);
//显示图像
cvShowImage("Example6", out);
//等待用户按键操作
waitKey(0);
//释放内存
cvReleaseImage(&out);
//销毁窗口
cvDestroyWindow("Example6");
}
/*
从摄像机读入数据
*/
void videoCapture() {
CvCapture* capture = cvCreateCameraCapture(0);
//分配一帧
IplImage* frame;
while (true)
{
//将下一帧载入内存
frame = cvQueryFrame(capture);
if (!frame)break;
cvShowImage("Example7", frame);
//等待33秒,实际应用中可以从capture中读取实际帧率
char c = cvWaitKey(10);
if (c == 27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example7");
}
写入avi视频
/*
写入avi视频文件
*/
void writeVideo() {
CvCapture* capture = 0;
capture = cvCreateFileCapture("output.avi");
if (!capture) {
return;
}
//初始化视频读入
IplImage *bgr_frame = cvQueryFrame(capture);
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(
"output2.avi",//视频文件名
CV_FOURCC('M', 'J', 'P', 'G'),//编码格式
fps,//播放帧率
size//视频图像大小
);
IplImage* logpolar_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
3
);
while ((bgr_frame=cvQueryFrame(capture))!=NULL)
{
cvLogPolar(
bgr_frame,
logpolar_frame,
cvPoint2D32f(
bgr_frame->width/2,
bgr_frame->height/2),
40,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);
cvWriteFrame(writer,logpolar_frame);
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&logpolar_frame);
cvReleaseCapture(&capture);
}