您的位置:首页 > 理论基础

计算机视觉(opencv和卷积)

2016-11-23 14:56 363 查看
计算机视觉 (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(fra
94e5
me, 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算机视觉 opencv