OpenCV:几个入门小demo

0.001字数 750阅读 891

一、显示图像

从磁盘中加载一张图片并在屏幕上显示

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, const char * argv[]) {
    IplImage* img =cvLoadImage("/Users/Desktop/test.jpg");
    cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
    cvShowImage("test", img);
    cvWaitKey(0);
    cvReleaseImage(&img);
    cvDestroyWindow("test");
    return 0;
}
  1. IplImage* img =cvLoadImage("/Users/Desktop/test.jpg");
    将图像文件加载到内存,并返回一个指针,此指针指向一块位描述改该图像文件的数据结构而分配的内存块。IplImage结构体将是我们在使用OpenCV时最常用到的数据结构。OpenCV使用IplImage结构体处理诸如单通道、多通道、整型、浮点型等所有类型的图像文件。

  2. cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
    该函数由HighGUI库提供,cvNamedWindow函数用于在屏幕上创建一个窗口。第一个参数指定了该窗口的标题,第二个定义了窗口的属性,该参数可被设置为0(默认)或CV_WINDOW_AUTOSIZE。设置为0时窗口的大小不会因图像的大小而改变,CV_WINDOW_AUTOSIZE:则会根据图像的实际大小自动进行拉伸或缩放。

  3. cvShowImage("test", img);
    在一个已经创建的窗口上使用cvShowImage显示图像。第一个参数确定在哪个已经存在的窗口中显示图像。

  4. cvWaitKey(0);
    该函数的功能是使程序暂停,等待用户触发一个按键操作。如果将这个函数参数设为整数,则程序暂停一段时间。当设置为0或负数时,程序将一直等待用户触发按键操作。

二、播放一个小视频

播放视频几乎与现实图像一样容易。播放视频是只需要处理的问题是如何循环地读取视频中的每一帧,以及如何退出循环。

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, const char * argv[]) {
    cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
    CvCapture* capture=cvCreateFileCapture("/Users/Downloads/181123080148212016.mp4");
    IplImage* frame;
    while (1) {
        frame= cvQueryFrame(capture);
        if(!frame)break;
        cvShowImage("test", frame);
        char c= cvWaitKey(33);
        if(c==27) break;
        
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("test");
    return 0;
}

CvCapture* capture=cvCreateFileCapture("/Users/Downloads/181123080148212016.mp4");

读入视频文件返回一个CvCapture结构的指针。这个结构体包括了所有关于要读入的视频文件的信息。进入循环后cvQueryFrame用来将下一帧视频文件载入内存中返回一个当前帧的指针。与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在CvCapture结构中已经分配好的内存

三、一个简单的变换

载入一张图片病进行平滑处理

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, const char * argv[]) {
    IplImage* image =cvLoadImage("/Users/huangyoubin/Desktop/test.jpg");
    cvNamedWindow("test_in",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("test_out",CV_WINDOW_AUTOSIZE);
    cvShowImage("test_in", image);
    IplImage* out =cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
    cvSmooth(image, out,CV_GAUSSIAN,3,3);
    cvShowImage("test_out", out);
    cvWaitKey(0);
    cvReleaseImage(&image);
    cvReleaseImage(&out);
    cvDestroyWindow("test_in");
    cvDestroyWindow("test_out");
    return 0;
}
  1. IplImage* out =cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
    第一个参数CvSize:通过cvGetSize获取,获取当前图像的大小。
    第二个参数:告诉我们各通道每个像素点的数据类型。
    最后一个参数:说明通道的总数
    当前图像是3个通道(每个通道8位)
  2. cvSmooth
    平滑处理实际上只是对cvSmooth函数的调用:指定输入图像,输出图像,平滑操作的方法以及平滑处理的一些参数。上面的程序中使用每个像素周围3*3区域进行高斯平滑处理。

上一篇:OpenCV:mac上安装和配置