计算机视觉(opencv和卷积)

计算机视觉 (opencv与卷积)
代码如下:
一:
使用VideoCapture类读取摄像机与视频

VideoCapture cap(0);//0为主摄像头1和2可以添加与USB相连的摄像头,也可添加路径使用其他video
    while (true) {
        Mat frame;//创建Mat
        cap >> frame;//读取摄像头存入frame中
        namedWindow("123",0);//创建窗口123 0可以改变窗口大小,1不能改变窗口大小 
        imshow("123",frame);//将frame展示在123窗口
        waitKey(30);//等待30毫秒读取下一帧操作
    }

二:读取图片

Mat imggray=imread("123.jpeg",1);//读取图片,1表示图像的三通道彩图 0表示灰度图cv_8uc1
cvtColor(imggray, imggray, CV_RGB2GRAY);//将彩图转换灰度图 参数(原图,目标图,转换为什么类型)
cout<<(int)imggray.at<uchar>(1, 1);//输出图片(1,1)的像素值

三:Mat的一些基本操作

Mat image = Mat::eye(5,5,CV_64FC1);//创建5*5二维数组eye(单位矩阵) zero(全0矩阵 ) 
cout << image << endl;
Mat image1 = Mat::ones(5, 5, CV_64FC1);ones(全1矩阵)
Mat sum = image +image1;//矩阵相加
cout << sum;//输出相加后的矩阵
image1.t();//转置
image1.copyTo();//拷贝
image1.inv();//求逆

四:图像x方向上的求导
公式:g(x,y)=f(x,y-1)-f(x,y+1)

VideoCapture cap(0);
    while (true)
    {
        Mat frame;
        cap>>frame;
        cvtColor(frame, frame, CV_RGB2GRAY);//将当前frame转为灰度图
        //cout << "row:" << frame.rows << "col:" << frame.cols << endl;//输出图像的行列值
        Mat dimg = Mat(frame.rows, frame.cols - 2, CV_8UC1);//第一列和最后一列不处理
        for (int i = 0;i < frame.rows;i++) {
            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);//求导
            }
        }

五:图像卷积操作
利用卷积可以实现对图像模糊处理,边缘检测,产生轧花效果的图像。
输出的图像g(x,y)=f(x,y)model(x,y);如图中,0*4+0*0+0*0+0*0+0*1+0*1+0*0+0*1+2(-4)=-8
即图中(2,2)的值为-8。
这里写图片描述

        Mat dimg = Mat(frame.rows, frame.cols - 2, CV_8UC1);
        Mat model = Mat(1, 3, CV_64FC1);//卷积的模型
        model.at<double>(0, 0) = 1;//模型赋值
        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);
                    }
                }
                dimg.at<uchar>(i, j - 1) =(uchar) sum;//将得到的sum赋给输出矩阵相应位置
            }
        }

        imshow("123", dimg);
        waitKey(10);
    }

六:高斯模糊创建与卷积的操作
高斯模糊通常用来减少图像噪声以及降低细节层次。
“模糊”,可以理解成每一个像素都取周边像素的平均值。

二维图像处理的高斯公式归一化
通过高斯定理,计算相应位置变化后的值,得到变换的模型,在卷积操作。如果图为彩色图,要对RGB三个通道分别做高斯模糊

Mat gauss(5, 5, CV_64FC1);//创建高斯矩阵
    double sigma = 0.5;//定义sigma大小
    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;//归一化处理

        }
    }
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++) {
            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);//将frame进行高斯模糊与原图卷积处理

                    }
                }
                dimg.at<uchar>(i - 2, j - 2) = (uchar)sum;
            }
        }
        imshow("gauss", dimg);
        waitKey(10);
    }

八:利用API进行相关操作

VideoCapture cap(0);
while (true)
{
    Mat frame;
    cap >> frame;
    cvtColor(frame, frame, CV_RGB2GRAY);
    GaussianBlur(frame, frame, cvSize(5, 5), 10, 10);//高斯滤波函数
    Canny(frame, frame, 100, 100);//Canny边缘检测
    Sobel(frame, frame, 0, 1, 1);//Sobel边缘检测
    imshow("123", frame);
    waitKey(10);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值