计算机视觉(opencv和卷积)

来源:互联网 发布:win10 禁用windows 键 编辑:程序博客网 时间:2024/04/30 12:26

计算机视觉 (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_8uc1cvtColor(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);}
0 0