学习OpenCV  第二章示例

直接贴代码,解释都在注释里,全部可以运行。




#include <cv.h>
#include <highgui.h>
#include<stdlib.h>
#include<stdio.h>
// 初始化
int g_slider_postion = 0;
CvCapture* g_capture = NULL;

// 声明函数
int showAVI(int argc);
int showImage();
void showTrackableAVI();
void SmoothOut();
IplImage* doPyrDown(IplImage* in,int filter);
IplImage* doCanny( IplImage* in,double lowThresh,double highThresh,double apetrue);
void doWriteAVI();

int main(int argc, char* argv[])
{
//SmoothOut();
//showTrackableAVI();
//showImage();
//showAVI(argc);
doWriteAVI();

puts("结束了");
return 0;
}

int showImage()
{
puts("任务:显示图像,执行缩放,执行边缘检测");

const char* filename = "d:\\4.jpg" ;//换成你自己的文件路径名!!请注意,双斜杠!!  
const char* wndname = "ShowImage" ;  
//cvLoadImage 读入图片后,返回一个指向该图像的数据结构的指针
IplImage* pImage = cvLoadImage(filename,0) ; 
IplImage* out;

// 显示一个窗口,参数1 为 窗口名称,参数2 为 窗口大小设置,是自动扩大,还是自动伸缩
cvNamedWindow(wndname,CV_WINDOW_AUTOSIZE);  
//显示图片,参数1 为 要显示到窗口名称,参数2 为 指向图片的数据结构内存地址的指针
cvShowImage(wndname,pImage);
 
cvNamedWindow("PyrDown",CV_WINDOW_AUTOSIZE);
out = doPyrDown(pImage,IPL_GAUSSIAN_5x5);
cvShowImage("PyrDown",out);  
cvNamedWindow("CannyDetect",CV_WINDOW_AUTOSIZE);
out = doCanny(pImage,10,100,3);
cvShowImage("CannyDetect",out);
// 使程序暂停,等待用户触发一个操作,参数为正表示等待的ms时长,为0 或 负表示将一直等待用户的按键操作
cvWaitKey(0);  
// 释放为该图像文件指定的内存,pImage指针为null
cvReleaseImage(&pImage);
cvReleaseImage(&out);
//销毁窗口并释放为改窗口分配的所有内存
cvDestroyAllWindows();
return 0;
}

int showAVI(int argc)
{
// 首先创建一个窗口,名字叫Example2 大小自由比率
cvNamedWindow("showAVI",CV_WINDOW_KEEPRATIO);
// 通过参数设置确定要读入的文件,然后返回一个指向CvCapture 结构的指针,capture结构指针被指向AVI文件的开头
CvCapture* capture ;
if(argc == 1 ) capture = cvCreateCameraCapture(0);
elsecapture = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");
assert(capture !=NULL);
IplImage* frame ;
while(1)
{
//用来将下一帧视频文件填充到CvCapture指针
frame = cvQueryFrame(capture);
if( !frame)break;
//显示每一帧
//IplImage* frame1 = doCanny(frame,30,100,3); 由于输入的图像不是灰度图像,所以不会执行
cvShowImage("showAVI",frame);
//控制每一帧的切换时间,即帧速率30帧/S
char c = cvWaitKey(33);
//如果按键为ESC(ASCII 为 27) 则退出
if( c == 27) break;

}
// 释放 CVCapture结构开辟的内存空间
cvReleaseCapture(&capture);
cvDestroyWindow("showAVI");
return 0;
}

void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
}

void showTrackableAVI()
{
// 首先创建一个窗口,名字叫Example2 大小自由比率
cvNamedWindow("Example3",CV_WINDOW_KEEPRATIO);
// 通过参数设置确定要读入的文件,然后返回一个指向CvCapture 结构的指针,capture结构指针被指向AVI文件的开头
g_capture  = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");
//cvGetCaptureProperty(pram1,pram2) 让用户获得CvCapture 的属性信息,
//参数1为要获得属性的CvCapture ,参数2为属性字段
//可以是帧的总数:CV_CAP_PROP_FRAME_COUNT
//可以是帧的宽度:CV_CAP_PROP_FRAME_WIDTH
//可以是帧的高度:CV_CAP_PROP_FRAME_HEIGTH

int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
if(frames  != 0)
{
cvCreateTrackbar("Postion","Example3",&g_slider_postion,frames,onTrackbarSlide);
}

IplImage* frame ;
while(1)
{
// 用来将下一帧视频文件填充到IplImage指针
frame = cvQueryFrame(g_capture);
if( !frame)break;
// 显示每一帧
cvShowImage("Example3",frame);
// 控制每一帧的切换时间,即帧速率30帧/S
char c = cvWaitKey(33);
//如果按键为ESC(ASCII 为 27) 则退出
if( c == 65) 
{
onTrackbarSlide(20);
}else if ( c == 27)
{
break;
}
}
// 释放 CVCapture结构开辟的内存空间
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return ;
}

void SmoothOut()
{
const char* filename = "d:\\5.jpg" ;//换成你自己的文件路径名!!请注意,双斜杠!!  
const char* wndname1 = "Smooth_In" ;  
const char* wndname2 = "Smooth_Out";
cvNamedWindow(wndname1,CV_WINDOW_FREERATIO);
cvNamedWindow(wndname2,CV_WINDOW_FREERATIO);
//cvLoadImage 读入图片后,返回一个指向该图像的数据结构的指针
IplImage* pImage = cvLoadImage(filename,-1) ; 
cvShowImage(wndname1,pImage);

// 这里一定要注意,如果输入的pImage 不是三通道的,那么将会导致Exception
// 比如这里我们在上面cvLoadImage的第二个参数,如果我们设为0 ,那么将为单通道的灰度图像,这里再使用3通道就将出错
IplImage* out = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,3);
cvSmooth(pImage,out,CV_GAUSSIAN,3,0,0,0);
cvWaitKey(3);
cvShowImage(wndname2,out);  
// 使程序暂停,等待用户触发一个操作,参数为正表示等待的ms时长,为0 或 负表示将一直等待用户的按键操作
cvWaitKey(0);  
// 释放为该图像文件指定的内存,pImage指针为null
cvReleaseImage(&out);
cvReleaseImage(&pImage);
//销毁窗口并释放为改窗口分配的所有内存
cvDestroyAllWindows();
}

//对原图使用PyrDown(src,des)缩放
IplImage* doPyrDown(IplImage* in,int filter)
{
assert( in->width % 2 == 0 && in->height % 2 ==0);
IplImage* out = cvCreateImage(cvSize( in->width/2,in->height/2),in->depth,in->nChannels);
//按照源图像大小进行缩放,缩放后的图像存于out 中,包含了输出图像的内存分配
cvPyrDown(in,out,filter);
return out;
}

IplImage* doCanny( IplImage* in,double lowThresh,double highThresh,double apetrue)
{
// canny 只处理单通道的灰度级的图像,
if(in->nChannels != 1)return (0);
puts("execute canny");
IplImage* out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,1);
cvCanny(in,out,lowThresh,highThresh,apetrue);
return (out);
}

//     读入视频,并使用极坐标将其转换为人眼所看到的图像,灰度没有实现。
void doWriteAVI()
{
//打开视频
CvCapture* capture = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");
// 指针的键为地址,其指向的内容为值,其实就是一个键值对
if(!capture)return;
// 读入视频
IplImage* bg_frame = cvQueryFrame(capture);
// 通过getcaptureproperty来获得视频信息,帧速率
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));
//获得视频写指针,cvCreatVideoWriter()四个参数
//1.为视频源文件
//2.指定编码格式,四个字符构成了编解码器的“4字标记”,
//3.帧速率
//4.视频图像大小
CvVideoWriter* writer = cvCreateVideoWriter("c:\\Users\\iSky\\Desktop\\grey filghtless bird.avi",
CV_FOURCC('M','J','J','G'),fps,size);
//    
IplImage* logpolar_frame = cvCreateImage(size,IPL_DEPTH_8U,3);
//2D point with floating-point coordinates.  二维坐标点,值为单精度浮点数
const CvPoint2D32f points = cvPoint2D32f(bg_frame->width/2,bg_frame->height/2);

while((bg_frame=cvQueryFrame(capture))!=NULL)
{
//src 输入图像,dst 输出图像,center 变换的中心, M 幅度的尺度参数,flags 插值方法
//之所以转换为极坐标,是将其转换为人眼看到的
//以图像中心位原点,缩放比例40,双线性插值,
cvLogPolar(bg_frame,logpolar_frame,points,40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);
cvWriteFrame(writer,logpolar_frame);
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&logpolar_frame);
cvReleaseCapture(&capture);
return;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值