Opencv显示图像
#include "opencv2/highgui.hpp"
int main(int argc , char** argv)
{
IplImage* img = cvLoadImage("/Users/mac/Desktop/1.png");//将图像文件加载至内存
cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);//用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
cvShowImage("Example1", img);// 在名为Example1的窗口中显示图像img
cvWaitKey(0);// 使程序暂停
cvReleaseImage(&img);//释放为该文件所分配的内存
cvDestroyWindow("Example1");//销毁显示图像文件的窗口。
}
1. cvLoadImage()通过文件名确定被加载文件的格式,并且该函数将自动分配图像数据结构所需的内存
2. cvNamedWindow().第一个参数指定了窗口的标题,第二个参数指定了窗口的性质,设置为0时,窗口的大小不会因为图像的大小而改变,图像只能在窗口中根据窗口的大小进行拉伸或缩放,而设置为CV_WINDOW_AUTOSIZE时,窗口会根据图像的实际大小自动进行拉伸或缩,以容纳图像。
3. cvShowImage()用于显示图像,第一个参数指定已存在的窗口名,第二个参数指定图片。
4. cvWaitKey()的功能是使程序暂停,单位为毫秒,若参数是0或负数,则程序将一直等待用户触发按键。
5. cvReleaseImage()释放为该图像文件所分配的内存。该函数执行完毕后,img指针将被设置为NULL。
6. cvDestroyWindow()销毁显示图像文件的窗口,并同时释放为该窗口所分配的所有内存(包括窗口内部的图像内存缓冲区,该缓冲区保存了与img指针有关的图像文件像素信息)。
Opencv播放AVI视频
版本一
#include "highgui.hpp"
#include "cv.h"
int main(int argc,char ** argv)
{
cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCreateFileCapture("/Users/mac/Desktop/2.mov");//cvCreateFileCapture通过参数确定要读入的视频文件,返回一个指向CvCapture结构的指针。这个结构包括了要读入的视频文件的信息,其中包括状态信息。调用这个函数后,capture将被初始化到对应视频文件的开头。
IplImage* frame;// 存储一帧视频文件
while(true)//开始读入视频文件
{
frame = cvQueryFrame(capture);//将下一帧视频文件载入内存,
if(!frame)
break;
cvShowImage("Example2", frame);//
char c = cvWaitKey(1000);
if(c == 27) break;
}
cvReleaseCapture(&capture);//释放capture结构开辟的内存空间
cvDestroyWindow("Exapmle2");
}
版本二(有滚动条)
#include "highgui.hpp"
#include "cv.h"
int g_slider_position = 0;//记录滑块位置
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos) //设置视频读入位置
{
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);//pos为当前滚动条的位置
// printf("pos:%d\n",pos);
// printf("CV_CAP_PROP_POS_FRAMES:%d\n",CV_CAP_PROP_POS_FRAMES);
}
int main(int argc,char ** argv)
{
cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("/Users/mac/Desktop/2.mov");//cvCreateFileCapture通过参数确定要读入的视频文件,返回一个指向CvCapture结构的指针。这个结构包括了要读入的视频文件的信息,其中包括状态信息。调用这个函数后,capture将被初始化到对应视频文件的开头。
int frames = cvGetCaptureProperty(g_capture, 7);//获得视频的总帧数
// printf("%d\n",frames);//416
// printf("%d\n",CV_CAP_PROP_FRAME_COUNT);//7
if(frames != 0)
{
cvCreateTrackbar("Position", "Example3", &g_slider_position, frames,onTrackbarSlide);//设置滚动条的名称并确定滚动条所属的窗口,当滚动条拖动时回调函数onTrackbarSlide被触发。
printf("g_slider_position:%d\n",g_slider_position);
}
IplImage* frame;// 存储一帧视频文件
while(true)//开始读入视频文件
{
frame = cvQueryFrame(g_capture);//将下一帧视频文件载入内存,
if(!frame)
break;
cvShowImage("Example3", frame);//
char c = cvWaitKey(30);
if(c == 27) break;
}
cvReleaseCapture(&g_capture);//释放capture结构开辟的内存空间
cvDestroyWindow("Exapmle3");
}
int cvCreateTrackbar(
const char* trackbar_name;//滑动条的名称
const char* window_name;//窗口的名称,滑动条不会遮挡图像
int* value;//当滑动条被拖到时,OpenCV会自动将当前位置所代表的值传给指针指向的整数
int count;//滑动条所能达到的最大值
CvTrackbarCallback on_change; //可选的回调函数,回调函数可参见http://wapedia.mobi/zhtrad/回调函数
);
说明
pos:72
CV_CAP_PROP_POS_FRAMES:1
g_slider_position:72
由控制台输出的结果发现onTrackbarSlide函数参数pos的值将会赋给g_slider_position。
滚动条的滑块并不会随着播放时间而向前滑动。
效果
图像平滑处理
#include "highgui.hpp"
#include "cv.h"
void example2_4(IplImage* image)/
{
cvNamedWindow("Example4-in",0);//用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
cvNamedWindow("Example4-out",0);//用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
cvShowImage("Example4-in",image);// 在名为Example4-in的窗口中显示图像img
IplImage* out = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);//分配自己的图像结构空间,第一个参数说明了图像的大小,第二个参数说明了各个通道每个像素点的数据类型,第三个参数说明了通道的总数
cvSmooth(image, out,CV_GAUSSIAN,3,3);//对每个像素周围3*3区域进行高斯平滑处理。
cvShowImage("Example4-out", out);
cvReleaseImage(&out); //释放与图像对应的内存空间
cvWaitKey(0);
cvDestroyWindow("Example4-in");//销毁显示图像文件的窗口。
cvDestroyWindow("Example4-out");//销毁显示图像文件的窗口。
}
int main(int argc , char** argv)
{
IplImage* img = cvLoadImage("/Users/mac/Desktop/4.png");//将图像文件加载至内存
example2_4(img);
cvReleaseImage(&img);//释放为该文件所分配的内存
}
效果
图像缩放处理
#include "highgui.hpp"
#include "cv.h"
IplImage* doPyrDown(IplImage* in)
{
assert(in->width%2 == 0 && in->height%2 == 0);
IplImage* out = cvCreateImage(cvSize(in->width/2, in->height/2), in->depth, in->nChannels);//创建新图像空间,长宽各一半,同深度,同通道数
cvPyrDown(in, out);//创建一幅高度宽带均为输入图像一半尺寸的图像
return out;
}
void example2_4(IplImage* image)
{
cvNamedWindow("Example4-in",CV_WINDOW_AUTOSIZE);//用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
cvNamedWindow("Example4-out",CV_WINDOW_AUTOSIZE);//用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
cvShowImage("Example4-in",image);// 在名为Example4-in的窗口中显示图像img
IplImage* out = doPyrDown(image);
cvShowImage("Example4-out", out);
cvReleaseImage(&out);//释放与图像对应的内存空间
cvWaitKey(0);
cvDestroyWindow("Example4-in");//销毁显示图像文件的窗口。
cvDestroyWindow("Example4-out");//销毁显示图像文件的窗口。
}
int main(int argc , char** argv)
{
IplImage* img = cvLoadImage("/Users/mac/Desktop/4.png");//将图像文件加载至内存
example2_4(img);
cvReleaseImage(&img);//释放为该文件所分配的内存
}
效果