学习opencv第四章练习题

1, a)

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

IplImage* doCanny(
    IplImage* in,
    double lowThresh,
    double highThresh,
    double aperture
    )
{
    if(in->nChannels != 1)
        return 0;//只检测单通道灰度图像
    IplImage* out = cvCreateImage(
        cvGetSize( in ),
        IPL_DEPTH_8U,
        1
        );
    cvCanny(in,out,lowThresh,highThresh,aperture);
    return out;
}


int main(int argc,char* argv[])
{
    printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n");
    printf("***************************************\n");
    //printf("请输入视频路径:\n");
    CvCapture* capture = cvCreateFileCapture( "test.flv" );

    //原视频帧
    IplImage* frame;
    //灰度视频帧
    IplImage* frame_gray = cvCreateImage(
        cvSize(
        (int)cvGetCaptureProperty(
            capture,
            CV_CAP_PROP_FRAME_WIDTH
        ),
        (int)cvGetCaptureProperty(
            capture,
            CV_CAP_PROP_FRAME_HEIGHT
        )
        ),
        IPL_DEPTH_8U,
        1
        );
    //canny视频帧
    IplImage* frame_canny = cvCreateImage(
        cvSize(
        (int)cvGetCaptureProperty(
            capture,
            CV_CAP_PROP_FRAME_WIDTH
        ),
        (int)cvGetCaptureProperty(
            capture,
            CV_CAP_PROP_FRAME_HEIGHT
        )
        ),
        IPL_DEPTH_8U,
        1
        );
    cvNamedWindow("原视频");
    cvNamedWindow("灰度视频");
    cvNamedWindow("canny 视频");
    while(1)
    {
        frame = cvQueryFrame( capture );
        if(!frame)break;//视频结束

        cvCvtColor(frame,frame_gray,CV_BGR2GRAY);
        frame_canny = doCanny(frame_gray,10,100,3);

        cvShowImage("原视频",frame);
        cvShowImage("灰度视频",frame_gray);
        cvShowImage("canny 视频",frame_canny);
        if(cvWaitKey(33) == 27)break;
    }
    cvReleaseCapture(&capture);
    cvReleaseImage(&frame_gray);
    cvReleaseImage(&frame_canny);
    cvDestroyWindow("原视频");
    cvDestroyWindow("灰度视频");
    cvDestroyWindow("canny 视频");
}

b)

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

IplImage* doCanny(
    IplImage* in,
    double lowThresh,
    double highThresh,
    double aperture
    )
{
    if(in->nChannels != 1)
        return 0;//只检测单通道灰度图像
    IplImage* out = cvCreateImage(
        cvGetSize( in ),
        IPL_DEPTH_8U,
        1
        );
    cvCanny(in,out,lowThresh,highThresh,aperture);
    return out;
}

int main(int argc,char* argv[])
{
    printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n");
    printf("***************************************\n");
    //printf("请输入视频路径:\n");
    CvCapture* capture = cvCreateFileCapture( "test.flv" );

    //原视频帧
    IplImage* frame = NULL;
    frame = cvQueryFrame(capture);
    int width = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
    int heigth = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
    //大图片
    IplImage* frame_total = cvCreateImage(
        cvSize(width*3,heigth),
        IPL_DEPTH_8U,
        frame->nChannels
        );
    //单通道灰度视频帧
    IplImage* frame_gray = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        1
        );
    //3通道灰度视频帧
    IplImage* gray = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    //单通道canny视频帧
    IplImage* frame_canny = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        1
        );
    //3通道canny视频帧
    IplImage* canny = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    //创建三个图像头
    IplImage* image1 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    IplImage* image2 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    IplImage* image3 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    cvZero(frame_total);

    image1->origin = frame->origin;
    image1->widthStep = frame_total->widthStep;
    image1->depth = frame->depth;
    image1->nChannels = 3;
    image2->origin = frame->origin;
    image2->widthStep = frame_total->widthStep;
    image2->depth = frame->depth;
    image2->nChannels = 3;
    image3->origin = frame->origin;
    image3->widthStep = frame_total->widthStep;
    image3->depth = frame->depth;
    image3->nChannels = 3;

    cvNamedWindow("原视频");

    while(1)
    {
        frame = cvQueryFrame( capture );
        if(!frame)break;               //视频结束

        cvCvtColor(frame,frame_gray,CV_BGR2GRAY);
        cvCvtColor(frame_gray,gray,CV_GRAY2RGB);
        frame_canny = doCanny(frame_gray,10,100,3);
        cvCvtColor(frame_canny,canny,CV_GRAY2RGB);

        image1->imageData = frame_total->imageData;    
        cvCopy(frame,image1);
        image2->imageData = frame_total->imageData+frame->widthStep;
        cvCopy(gray,image2);
        image3->imageData = frame_total->imageData+2*frame->widthStep;
        cvCopy(canny,image3);

        cvShowImage("原视频",frame_total);
        
        if(cvWaitKey(33) == 27)break;
    }
    cvReleaseCapture(&capture);
    cvReleaseImage(&frame_gray);
    cvReleaseImage(&frame_canny);
    cvReleaseImage(&gray);
    cvReleaseImage(&canny);
    cvDestroyWindow("原视频");
}

 2

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

//回调函数
void my_mouse_callback(int event, int x, int y, int flags, void* param);
bool click = false;
char str[100];
CvPoint point;
CvFont font = cvFont(10.0,0);



int main(int argc,char* argv[])
{
    IplImage* img = cvLoadImage("12.jpg");
    IplImage* temp = cvCloneImage(img);
    cvNamedWindow("image");
    
    cvSetMouseCallback(
            "image",
            my_mouse_callback,
            (void*) img
            );
    while(1)
    {
        cvCopy(img,temp);
        if(click)
        {
            cvPutText(temp,str,point,&font,cvScalar(0,255,0));
        }
        cvShowImage("image",temp);
        if(cvWaitKey(15)==27)break;
    }
    return 0;
}

void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
    IplImage* image = (IplImage*) param;
    switch(event)
    {
    case CV_EVENT_MOUSEMOVE:
        break;
    case CV_EVENT_LBUTTONDOWN:
        {
            click = true;
            CvScalar pt = cvGet2D(image,y,x);
            double b = pt.val[0];
            double g = pt.val[1];
            double r = pt.val[2];
            memset(str,0,30);
            point = cvPoint(x,y);
            sprintf(str,"R:%.0f,G:%.0f,B:%.0f",r,g,b);
            printf("R:%.0f,G:%.0f,B:%.0f\n",r,g,b);
            cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5f,0.5f,0,1);

        }break;
    case CV_EVENT_LBUTTONUP:
        click = false;
        break;
    }
}

 a)

View Code
#include <cv.h>
#include <highgui.h>
#include <stdio.h>


void my_mouse_callback(int event, int x, int y, int flags, void* param);
bool click = false;
char str[100];
CvPoint point;
CvFont font = cvFont(10.0,0);


IplImage* doCanny(
    IplImage* in,
    double lowThresh,
    double highThresh,
    double aperture
    )
{
    if(in->nChannels != 1)
        return 0;//只检测单通道灰度图像
    IplImage* out = cvCreateImage(
        cvGetSize( in ),
        IPL_DEPTH_8U,
        1
        );
    cvCanny(in,out,lowThresh,highThresh,aperture);
    return out;
}

int main(int argc,char* argv[])
{
    printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n");
    printf("***************************************\n");
    //printf("请输入视频路径:\n");
    CvCapture* capture = cvCreateFileCapture( "test.flv" );

    //原视频帧
    IplImage* frame = NULL;
    frame = cvQueryFrame(capture);
    int width = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
    int heigth = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
    //大图片
    IplImage* frame_total = cvCreateImage(
        cvSize(width*3,heigth),
        IPL_DEPTH_8U,
        frame->nChannels
        );
    //单通道灰度视频帧
    IplImage* frame_gray = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        1
        );
    //3通道灰度视频帧
    IplImage* gray = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    //单通道canny视频帧
    IplImage* frame_canny = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        1
        );
    //3通道canny视频帧
    IplImage* canny = cvCreateImage(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    //创建三个图像头
    IplImage* image1 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    IplImage* image2 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    IplImage* image3 = cvCreateImageHeader(
        cvSize(width,heigth),
        IPL_DEPTH_8U,
        3
        );
    cvZero(frame_total);

    image1->origin = frame->origin;
    image1->widthStep = frame_total->widthStep;
    image1->depth = frame->depth;
    image1->nChannels = 3;
    image2->origin = frame->origin;
    image2->widthStep = frame_total->widthStep;
    image2->depth = frame->depth;
    image2->nChannels = 3;
    image3->origin = frame->origin;
    image3->widthStep = frame_total->widthStep;
    image3->depth = frame->depth;
    image3->nChannels = 3;

    cvNamedWindow("原视频");


    IplImage* temp = cvCloneImage(frame_total);
    cvSetMouseCallback("原视频",my_mouse_callback,temp);
    while(1)
    {
        frame = cvQueryFrame( capture );
        if(!frame)break;               //视频结束

        cvCvtColor(frame,frame_gray,CV_BGR2GRAY);
        cvCvtColor(frame_gray,gray,CV_GRAY2RGB);
        frame_canny = doCanny(frame_gray,10,100,3);
        cvCvtColor(frame_canny,canny,CV_GRAY2RGB);

        image1->imageData = frame_total->imageData;    
        cvCopy(frame,image1);
        image2->imageData = frame_total->imageData+frame->widthStep;
        cvCopy(gray,image2);
        image3->imageData = frame_total->imageData+2*frame->widthStep;
        cvCopy(canny,image3);

        cvCopy(frame_total,temp);
        if(click)
        {
            cvPutText(temp,str,point,&font,cvScalar(0,255,0));    
        }


        cvShowImage("原视频",temp);
        
        if(cvWaitKey(33) == 27)break;
    }
    cvReleaseCapture(&capture);
    cvReleaseImage(&frame_gray);
    cvReleaseImage(&frame_canny);
    cvReleaseImage(&gray);
    cvReleaseImage(&canny);
    cvDestroyWindow("原视频");
}

void my_mouse_callback(int event, int x, int y, int flags, void* param)
{
    IplImage* image = (IplImage*) param;
    switch(event)
    {
    case CV_EVENT_MOUSEMOVE:
        break;
    case CV_EVENT_LBUTTONDOWN:
        {
            click = true;
            CvScalar pt = cvGet2D(image,y,x);
            double b = pt.val[0];
            double g = pt.val[1];
            double r = pt.val[2];
            memset(str,0,30);
            point = cvPoint(x,y);
            sprintf(str,"R:%.0f,G:%.0f,B:%.0f",r,g,b);
            printf("R:%.0f,G:%.0f,B:%.0f\n",r,g,b);
            cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5f,0.5f,0,1);

        }break;
    case CV_EVENT_LBUTTONUP:
        click = false;
        break;
    }
}

 4

View Code
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int g_slider_position=0;
CvCapture* g_capture = NULL;
int i = 0;
int g_slider_position1 = 0;
bool t = true;

void onTrackbarSlide(int pos)
{
    cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
    i = pos;
}
void switch_callback(int position)
{
    if(position == 0)
        t = true;
    else t = false;
}

int main(int argc,char* argv[])
{
    cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
    g_capture = cvCaptureFromFile("test.flv");
    int frame = (int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
    if(frame!=0)
    {
        cvCreateTrackbar("Position","Video",&g_slider_position,frame,onTrackbarSlide);
        cvCreateTrackbar("Position1","Video",&g_slider_position1,1,switch_callback);
    }else printf("read video wrong!\n");
    cvSetTrackbarPos("Position","Video",1);
    cvSetTrackbarPos("Position1","Video",0);
    IplImage *frames;
    while(1)
    {
        frames=cvQueryFrame(g_capture);
        if(frames==NULL)break;
        char c = cvWaitKey(33);
        if(c == 27)break;
        cvShowImage("Video",frames);
        cvSetTrackbarPos("Position","Video",i);
        if(t)
        {
            i+=10;
            cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,i);
        }else
        {
            cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,i);
        }
    }
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("Video");
    return 0;
}

 

posted on 2013-03-01 15:51  NewPanderKing  阅读(426)  评论(0)    收藏  举报

导航