从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中...

本文介绍了一种从视频文件读取数据并将其转换为灰度图的方法,随后使用Canny边缘检测算法处理图像,并最终在同一界面展示原始图像、灰度图及边缘检测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中
//作者:sandy
//时间:2015-10-10
#include <cv.h>
#include <highgui.h>

#include<stdarg.h>
#include <iostream>
void showThreeImage(char *title,int num,...){
    //声明变量
    IplImage *img;
    IplImage *dispImg;
    int i,m,n;
    //创建image,大小960*300,8位无符号,3通道
    dispImg = cvCreateImage(cvSize(960, 300), 8, 3);

    va_list args;//【定义不定参数列表args】
    va_start(args,num);//【获得第一个可变参数地址】
    for(i=0,m=20,n=20;i<num;i++,m+=320){
        img = va_arg(args,IplImage*);//【读取一个IplImage类型的,args指向下一个】
        if(img==0){
            printf("Invalid arguments");
            cvReleaseImage(&dispImg);
            return;
        }
        //设置感兴趣区域,随着for的循环,感兴趣区域不断右移
        cvSetImageROI(dispImg,cvRect(m,n,300, 300));
        //释放指针,为下一幅图的指向做准备
        cvResize(img,dispImg);
        //释放感兴趣区域,为下一次做准备
        cvResetImageROI(dispImg);
    }
    cvShowImage(title,dispImg);
    va_end(args);//【结束解析】
    cvReleaseImage(&dispImg);
    
}

int main(int argc, char *argv[]){
    CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件
    if(!capture) return -1;//检查函数是否成功
    cvNamedWindow("video",1);//声明窗口
    cvResizeWindow("video",960,300);
    //cvNamedWindow("video1",1);
    while(1){    
        //变量初始化
        IplImage *vd_frame = cvQueryFrame(capture);
        IplImage *gray_frame = cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,1);
        IplImage *canny_frame = cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,1);
        //和vd_frame一样的通道
        IplImage *frame1=cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,vd_frame->nChannels);
        IplImage *frame2=cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,vd_frame->nChannels);
        
        //image转换
        cvConvertImage(vd_frame,gray_frame,0);//flag=1则会得到倒立的图像
        cvCanny(vd_frame,canny_frame,10,50,3);//阈值一,小一点可以扣更多边缘。。阈值二越大扣的越少,3通道
        //cvShowImage("video1",canny_frame);
        //颜色转换
        cvCvtColor(gray_frame,frame1,CV_GRAY2RGB);//BGR或RGB都行
        cvCvtColor(canny_frame,frame2,CV_GRAY2RGB);
        //函数调用
        //cvShowImage("video1",frame1);
        showThreeImage("video",3,vd_frame,frame1,frame2);

        char c=cvWaitKey(28);
        if(c==27) break;
        //释放空间
        cvReleaseImage(&gray_frame);
        cvReleaseImage(&canny_frame);
        cvReleaseImage(&frame1);
         cvReleaseImage(&frame2);
        
    }
    cvReleaseCapture(&capture);
    cvDestroyAllWindows();
    return 0;
}

转载于:https://www.cnblogs.com/beihaidao/p/4887039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值