中北大学安卓实验室视觉培训第一期作业



一、摄像机与视频的读取

    VideoCapture cap(0);//读取摄像头,建立一个名为cap的videocapture的结构

    while (true)//循环为ture执行 
    {
        Mat frame;//建立一个名为frame的Mat类
        cap>>frame;//把cap输入到frame里

        namedWindow("123",0);//建立一个名为123的窗口,自适应大小
        imshow("123",frame);//在名为123的窗口上显示frame
        waitKey(30);//等待30ms
    }

二、读取图片与其中的像素值

    Mat imggray=imread("123.jpg",1);//建立一个名为imggray的Mat类,读取123.jpg图片,载入三通道颜色
    cvtColor(imggray,imggray,CV_RGB2GRAY);//用cvtColor函数将imggray转化为灰度图

    cout<<(int)imggray.at<uchar>(1,1)<<endl;//强制转换为int型
    imshow("123",imggray);//在名为123的窗口上显示图片
    waitKey(0);//无限等待

三、Mat对象一些操作 

 Mat imgone=Mat::ones(5,5,CV_64FC1);//定义一个5行5列的全部为1矩阵,cv_64fc1对应double类型
    Mat sum=image*imgone;//定义个Mat类sum,值为image与imgone的乘积
    cout<<sum<<endl;//输出sum
    Mat image=Mat::eye(5,5,CV_64FC1);//定义一个5行5列的对角矩阵
    image.inv();//image的逆矩阵

四、图像x方向求导的卷积与非卷积操作

VideoCapture cap(0);//读取摄像头
    while (true)
    {
        Mat frame;
        cap>>frame;

        cvtColor(frame,frame,CV_RGB2GRAY);
	/*cout<<"row"<<frame.rows<<" col"<<frame.cols<<endl;

        Mat dimg=Mat(frame.rows,frame.cols-2,CV_8UC1);//定义一个Mat类dimg的值为一个frame行数一样,列数少两列的矩阵,CV_8UC1是表示一个8位无符号整型单通道矩阵
        for (int i=0;i<frame.rows;i++)//这个循环是相当于对图像x求导
        {
            for (int j=1;j<frame.cols-1;j++)
            {
                dimg.at<uchar>(i,j-1)=frame.at<uchar>(i,j-1)-frame.at<uchar>(i,j+1);
            }
        }*/
        //下面是求图像的卷积
        Mat dimg=Mat(frame.rows,frame.cols-2,CV_8UC1);
        Mat model=Mat(1,3,CV_64FC1);//model为一个一行三列的64位浮点型单通道矩阵
        model.at<double>(0,0)=1;//对model这个矩阵赋值
        model.at<double>(0,1)=0;
        model.at<double>(0,2)=-1;
        for(int i=0;i<frame.rows;i++)//对图像求两次导
        {    for (int j=1;j<frame.cols-1;j++)
            {
                int half=model.cols/2;
                double sum=0;
                for (int m=0;m<model.rows;m++)
                {
                    for (int n=-half;n<model.cols-half;n++)
                    {
                        sum+=(double)(frame.at<uchar>(i+m,j+n))*model.at<double>(m,n+half);//强制转换为double类型
                    }
                }
                dimg.at<uchar>(i,j-1)=(uchar)sum;//将对应的值赋给dimg
            }

        }



        imshow("123",dimg);//在123窗口上显示dimg
        waitKey(10);//延迟等待10ms
    }

五、高斯模糊的核创建与卷积操作

   double sigma=50;//定义sigima的值
    Mat gauss(5,5,CV_64FC1);//创建一个矩阵
    for (int i=-2;i<3;i++)
    {
        for (int j=-2;j<3;j++)
        {
            gauss.at<double>(i+2,j+2)=exp(-(i*i+j*j)/(2*sigma*sigma));
        }
    }

    double gssum=sum(gauss).val[0];
    for (int i=-2;i<3;i++)
    {
        for (int j=-2;j<3;j++)
        {
            gauss.at<double>(i+2,j+2)/=gssum;
        }
    }

    //cout<<gauss<<endl;

    VideoCapture cap(0);/调用摄像头

    while (true){//使摄像头持续开启
        Mat frame;
        cap>>frame;
        cvtColor(frame,frame,CV_RGB2GRAY);//将图像转换为灰度图
        Mat dimg=Mat(frame.rows-4,frame.cols-4,CV_8UC1);
        for (int i=2;i<frame.rows-2;i++)//卷积操作,对图像x求两次导
        {
            for (int j=2;j<frame.cols-2;j++)
            {
                double sum=0;

                for (int m=0;m<gauss.rows;m++)
                {
                    for (int n=0;n<gauss.cols;n++)
                    {
                        sum+=(double)(frame.at<uchar>(i+m-2,j+n-2))*gauss.at<double>(m,n);//强制转换成double型uchar对应上面的CV_8UC1
                    }
                }
                dimg.at<uchar>(i-2,j-2)=(uchar)sum;

            }
        }


        imshow("a",frame);//在窗口a上显示frame
        imshow("gauss",dimg);//在窗口gauss上显示dimg
        waitKey(10);//等待10ms
六、相关API操作
    VideoCapture cap(0);//调用摄像头
    while (true)
    {
        Mat frame;
        cap>>frame;
        cvtColor(frame,frame,CV_RGB2GRAY);//转换成灰度图

        //GaussianBlur(frame,frame,cvSize(5,5),10,10);直接调用高斯模糊函数(输入图像,目标图像,高斯内核的大小[由sigima计算而来],高斯核函数在x方向上的的标准偏差,在y方向上的标准偏差)
        //Canny(frame,frame,100,100);调用Canny函数,算法做边缘检测(输入图像,目标图像,第一个阈值,第二个阈值)阈值用于控制边缘连接
        //Sobel(frame,frame,0,1,1);调用Sobel函数

        imshow("q",frame);//在窗口q上显示frame
        waitKey(10);//等待10ms

    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值