初步学习opencv的几个程序示例 学习笔记

使用的是opencv3.0    vs2012版本

 程序的头文件

#include
#include
using namespace std;
using namespace cv;

以下是程序的几个例子

void main()
{
//打开摄像头进行预览的程序
	VideoCapture cap(0);//0,1,2代表摄像头,0代表默认摄像头,也可以写路径,自己电脑上保存的视频
	while(true)
	{
		Mat frame;//创建一帧
		cap>>frame;//读取一帧图像保存在frame里
		//新建一个没有图像的窗口  名称为123 namedWindow("123",0);
		namedWindow("123",0);//0 窗口可拖动调大小 1不可拖动
		imshow("123",frame);//显示图像  123代表窗口名称  
		waitKey(30);//waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。
	}
}

黑白图片为二值图,每个像素点的灰度都可以用uchar表示 范围为0-255 为单通道      彩色图有三通道(RGB红绿蓝),四通道(RGBA红绿蓝+透明度)

在opencv中行称为row 列称为col     而且彩色图的色块从左到右排列为BGR排列

下面程序的作用是读取一个彩色图片转换为灰色图片  图片放置:右击工程列表的project,选择“在文件资源管理器中打开文件夹”,然后放进去一张照片

void main()
{
//读取一个彩色图片转换为灰色图片
  	//Mat imggray=imread("123.png",0);//读取一个名称为123.png的图片 0为灰度图 1为彩色图
	Mat imggray=imread("123.png",1);
	cvtColor(imggray,imggray,CV_RGB2GRAY);//转换图像 第一个为原图像,第二个为输出图像,第三个为转换方法(RGB转为灰色)
	imshow("123",imggray);//显示图片
	waitKey(0);//waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。
	system("pause");//暂停程序防止程序执行完毕自动退出
}

如果要读取某个点的像素值可以在代码中添加:

cout<<(int)imggray.at(1,1)<


 

图像其实就是一个矩阵的表示,使用opencv函数操作矩阵:

void main()
{
	//Mat imggray=imread("123.png",0);//读取一个名称为123的图片 0为灰度图 1为彩色图
	//Mat image=Mat(5,5,CV_64FC1);//创建一个5行5列的图像(矩阵)  (创建了一个动态(可以用参数改变)二维数组)  创建了一个矩阵
	//Mat image=Mat::zeros(5,5,CV_64FC1);//zeros全部置0
	//Mat image=Mat::ones(5,5,CV_64FC1);//ones全部置1
	Mat image=Mat::eye(5,5,CV_64FC1);//eye 填充为单位矩阵
	Mat imgone=Mat::ones(5,5,CV_64FC1);//ones 全部填充为1
	Mat sum=image+imgone;//矩阵的相加  可以直接+ - * /   输出
	cout<(0,0);
	//cout<

转置一个矩阵的例子:

 

void main()
{
	Mat image=Mat::eye(5,5,CV_64FC1);//eye 单位矩阵
	image.t();//t 转置矩阵 (此处有一大堆方法用)
	cout<


对图像进行手动写式子求导:

void main()
{
	//写一个图像的求导 手动求导
	VideoCapture cap(0);
	while(true)
	{
		Mat frame;
		cap>>frame;
		cvtColor(frame,frame,CV_RGB2GRAY);
		cout<<"row行"<(i,j-1)=frame.at(i,j-1)-frame.at(i,j+1);//像新建的图像中添加变换后的图像
			}
		}
		namedWindow("123",0);
		imshow("123",dimg);
		waitKey(10);
	}
}


使用卷积模版计算求导:

void main()
{
	//写一个图像的求导 卷积求导  模版为(1,0,-1)
	VideoCapture cap(0);
	while(true)
	{
		Mat frame;
		cap>>frame;
		cvtColor(frame,frame,CV_RGB2GRAY);
		cout<<"row行"<(0,0)=1;//对卷积模版赋值
		model.at(0,1)=0;
		model.at(0,2)=-1;
		for(int i=0;i(i+m,j+n))*model.at(m,n+half);
					}
				}
				dimg.at(i,j-1)=(uchar)sum;
			}
		}
		namedWindow("123",0);
		imshow("123",dimg);
		waitKey(10);
	}
}


对图像进行手动高斯变换(使图像变得模糊):

void main()
{
	//高斯化操作   图片模糊
	double sigma=0.5;
	Mat gauss(5,5,CV_64FC1);
	for(int i=-2;i<3;i++)
	{
		for(int j=-2;j<3;j++)
		{
			gauss.at(i+2,j+2)=exp(-(i*i+j*j)/(2*sigma*sigma));//exp即为e的N次方
		}
	}
	double gssum=sum(gauss).val[0];//sum.val对矩阵所有元素求和
	for(int i=-2;i<3;i++)
	{
		for(int j=-2;j<3;j++)
		{
			gauss.at(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(i+m-2,j+n-2))*gauss.at(m,n);//进行高斯变换
					}
				}
				dimg.at(i-2,j-2)=(uchar)sum;
			}
		}
		namedWindow("123",0);
		imshow("123",dimg);
		waitKey(10);
	}
}


 

调用api实现其他图像变换:

void main()
{
	VideoCapture cap(0);
	while(true)
	{
	Mat frame;
	cap>>frame;
	cvtColor(frame,frame,CV_RGB2GRAY);
	//GaussianBlur(frame,frame,CvSize(5,5),50,50);//使用一个函数直接实现高斯变换
	//Canny(frame,frame,100,100);//边缘画出(检测边缘)
	//Sobel(frame,frame,0,1,1);//另一种边缘画出的方法
	imshow("123",frame);
	waitKey(10);
	}
}

注释了三种变换,可以依次取消注释观看效果

你可能感兴趣的:(初步学习opencv的几个程序示例 学习笔记)