OpenCV —— HighGUI

分为:硬件相关部分,文件部分以及图形用户接口部分

 

创建窗口 —— cvNamedWindow

若设置成 CV_WINDOW_AUTOSIZE 窗口大小会随着图像的载入而根据图像大小调整,用户没办法手动调整窗口大小

设置成 0 ,随意调整

cvDestoyWindow   cvDestroyAllWindows

cvGetWindowHandle   cvGetWindowName

cvLoadImage  读入16位的彩色图像 —— CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH


鼠标事件相应采用回调函数的方式处理

CvMouseCallback

cvSetMouseCallback —— 注册到窗口(产生事件的窗口)

#include <cv.h>
#include <highgui.h>

CvRect box;
bool drawing_box = false;
void my_mouse_callback(int event,int x,int y,int flags,void* param);

void draw_box(IplImage* img,CvRect rect)
{
    cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
}

int main(int argc,char** argv)
{
    box=cvRect(-1,-1,0,0);
    
    IplImage* img=cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3);
    cvZero(img);
    IplImage* temp=cvCloneImage(img);

    cvNamedWindow("w1");

    cvSetMouseCallback("w1",my_mouse_callback,(void*)img);

    while(1)
    {
        cvCopyImage(img,temp);
        if(!drawing_box)
            draw_box(temp,box);
        cvShowImage("w1",temp);

        if(cvWaitKey(15)==27)
            break;
    }

    cvReleaseImage(&img);
    cvReleaseImage(&temp);
    cvDestroyWindow("w1");

    return 0;
}


void my_mouse_callback(int event,int x,int y,int flags,void* param)
{
    IplImage* img=(IplImage*)param;

    switch(event)
    {
    case CV_EVENT_MOUSEMOVE:
        {
            if(drawing_box)
            {
                box.width=x-box.x;
                box.height=y-box.y;
            }
        }
        break;
    case CV_EVENT_LBUTTONDOWN:
        {
            drawing_box=true;
            box=cvRect(x,y,0,0);
        }
        break;
    case CV_EVENT_LBUTTONUP:
        {
            drawing_box=false;
            if(box.width<0)
            {
                box.x+=box.width;
                box.width*=-1;
            }
            if (box.height<0)
            {
                box.y+=box.height;
                box.height*=-1;
            }
            draw_box(img,box);
        }
        break;
        
    }
}

 

sliders —— trackbar 滑动条   cvCreateTrackbar  回调函数

cvGetTrackbarPos   cvSetTrackbarPos  —— 读取设置滑动条的取值

OpenCV 不提供任何形式的按钮,用只有两个状态的滑动条来代替

#include <cv.h>
#include <highgui.h>

int g_switch_value =0;
IplImage* img;
IplImage* temp;

void Switch_callback(int position)
{
    if(position==0)
    {
        cvShowImage("w1",img);
    }else
    {
        cvShowImage("w1",temp);
    }
}

int main(int argc,char** argv)
{
    cvNamedWindow("w1",CV_WINDOW_AUTOSIZE);
    cvCreateTrackbar("Switch","w1",&g_switch_value,1,Switch_callback);
    img=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_UNCHANGED);
    temp=cvLoadImage("test.jpg",CV_LOAD_IMAGE_UNCHANGED);

    while(1)
    {
        if (cvWaitKey(15)==27)
            break;
    }

    cvDestroyWindow("w1");
    return 0;
}

视频处理

CvCapture —— 从摄像机或视频文件中读取帧所需要的信息

cvCreateFileCapture    cvCreateCameraCapture —— 为了使视频可以被成功读入,必须确保这种视频解码库已经安装在系统中

cvCreateCameraCapture  -1 时,Opencv会打开一个窗口让用户选择

读视频

cvGrabFrame(快速将视频帧读入内存,下一次调用时,指针所指向的空间会被新的图像覆盖,如果想做特殊处理需要先复制到其他地方。此内存空间由Opencv管理,不要去释放)   cvRetrieveFrame   cvQueryFrame(是cvGrabFrame 与 cvRetrieveFrame 的组合)

 

对一个视频文件,当调用 cvGrabFrame ,视频帧会自动前进一步,下一次调用会自动读入下一帧视频

cvReleaseCapture

cvGetCaptureProperty

cvVideoWriter 写视频 —— 不显式地释放写入结构,视频文件可能会被损坏 —— cvReleaseVideoWriter

HighGUI 中茕茕孑立的一个函数 —— ConvertImage (用于在不同图像格式之间转换 , 可以垂直旋转图像 —— 有时候摄像机图像格式与图像显示格式会反转)

posted @ 2014-06-24 14:47  老姨  阅读(1161)  评论(0编辑  收藏  举报