计算机视觉(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
- 计算机视觉(opencv和卷积)
- 计算机视觉(1)——卷积与opencv
- 计算机视觉与图像处理(一)——卷积与opencv
- 计算机视觉篇:一:opencv的基本操作,卷积。
- OpenCV-图像处理和计算机视觉
- 【计算机视觉】 opencv双目视觉标定、匹配和测量 (附代码)
- 计算机视觉与卷积神经网络
- 计算机视觉与卷积神经网络
- CS231n 卷积神经网络与计算机视觉 11 卷积神经网络的 迁移学习 和微调
- (01)opencv之计算机视觉——安装opencv
- 视频监控 形态学 OpenCV致力于计算机视觉技术研究(高密度环境下行人检测和统计)
- 计算机视觉---2.1---卷积与模板操作
- OpenCV—计算机视觉库
- OpenCV计算机视觉入门案例
- (一)OpenCV(开源计算机视觉库介绍)
- 计算机视觉(OpenCV基础)相关网站链接
- (一)OpenCV(开源计算机视觉库介绍)
- 计算机视觉——OpenCV中的SIFT(应用)
- mt7620a上带机量的提高(三)
- strchr函数的用法
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
- 09上机练习2
- 参照《第一行代码》开发CoolWeather (一)
- 计算机视觉(opencv和卷积)
- java中级面试题总结(1)
- API 25 (Android 7.1.1 API) view.SurfaceView
- 开源集锦(三)GitHub开源控件(一)
- 一个简单的取就近的五分钟的整数倍的日期
- 使用Docker部署Mesos
- 【C语言】称硬币问题
- js随时判断网络状态
- java线程通信 生产者与消费者模式