学习opencv_学习笔记一

第二章 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);

}

原文地址:https://www.cnblogs.com/retacn-yue/p/6194177.html