#include <opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void main(){
/*
VideoCapture cap(0);//调用摄像头,0为默认摄像头,可接入其他摄像头
while (true)
{
Mat Frame;//创建了一个Mat对象
cap >> Frame;//摄像头信息读入到对象中
namedWindow("frame", 0);//新建了一个窗口;0:可自由调节大小;;1.不可调节;
imshow("frame", Frame);//在frame窗口中输出对象
waitKey(0);//显示完第一帧后等待10毫秒显示下一帧
}
*/
/*
Mat imggray=imread("123.jpg",0);//创建一个对象并将图片读入,图片必须在同目录下
//1表示彩色图,0为灰色图
cvtColor(imggray,imggray,CV_RGB2GRAY );//将彩色图转为黑白图
cout << (int)imggray.at<uchar>(1, 1) << endl;//读出imggray的第一行第一列像素值转为int型输出
imshow("123", imggray);//在123窗口中输出图片
waitKey(0);//第一帧后等待0毫秒,即无穷,表示只显示第一帧
*/
/*
Mat image = Mat::eye(5, 5, CV_64FC1);//创建5乘5的对角矩阵,数据类型为double
cout << image << endl;//输出该矩阵
Mat imgone = Mat::ones(5, 5, CV_64FC1);//创建5乘5的单位矩阵,数据类型为double
Mat sum = image + imgone;//两矩阵相加
cout << sum << endl;//输出相加后的矩阵;
*/
/* //普通方法求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;
namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);
cout << "row" << Frame.rows << "col" << Frame.cols << endl;//输出Frame行和列的大小
Mat dimg = Mat(Frame.rows, Frame.cols-2,CV_8UC1);//用于存放对Frame X方向求导后的图像
//边缘两列不求导,故列数减2
for (int i = 0; i < Frame.rows; i++)//外层循环,对行循环,从0到Frame.rows-1行
{
for (int j = 1; j < Frame.cols-1; j++)//内层循环,对列循环,从第1列到Frame.cols-2列
{
dimg.at<uchar>(i, j - 1) = Frame.at<uchar>(i, j - 1) - Frame.at<uchar>(i, j + 1);
//求导
}
}
imshow("123",dimg);//输出求导后的图像
waitKey(10);
}
*/
/* //卷积方式实现求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;
namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);
cout << "row" << Frame.rows << "col" << Frame.cols << endl;
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;//模板元素为1,0,-1
for (int i = 0; i < Frame.rows; i++)//对Frame行循环
{
for (int j = 1; j < Frame.cols - 1; j++)//对Frame列循环
{
double sum = 0;
for (int m = 0; m < model.rows; m++)//对模板的行循环
{
for (int n = 0; n < model.cols; n++)//对模板的列循环
{
sum += (double)Frame.at<uchar>(i + m, j - 1 + n)*model.at<double>(m, n);
//对应位置的数相乘放到sum中
}
}
dimg.at<uchar>(i, j - 1) = (uchar)sum;//sum的值再赋给dimg的每个元素
}
}
imshow("123", dimg);//输出
waitKey(10);
}
*/
/*//高斯模糊
double sigma = 20;
Mat gauss(5, 5, CV_64FC1);//创建高斯模板
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);
//左右两列上下两行无法进行卷积运算,故各减4
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-2 + m, j-2+ n)*gauss.at<double>(m, n);
//与卷积求导同理
}
}
dimg.at<uchar>(i-2,j-2) = (uchar)sum;
}
}
namedWindow("frame", 0);
imshow("a", frame);
imshow("frame", dimg);
waitKey(10);
}
*/
VideoCapture cap(0);
while (true)
{
Mat frame, frame1, frame2, frame3;
cap >> frame;
cvtColor(frame, frame, CV_RGB2GRAY);
//API调用
GaussianBlur(frame, frame1, cvSize(5, 5), 10, 10);//高斯模糊
Canny(frame, frame2, 100, 100);//边缘检验
Sobel(frame, frame3, 0, 1, 1);//边缘检验
imshow("1", frame1);
imshow("2", frame2);
imshow("3", frame3);
waitKey(10);
}
system("pause");
}
#include <iostream>
using namespace cv;
using namespace std;
void main(){
/*
VideoCapture cap(0);//调用摄像头,0为默认摄像头,可接入其他摄像头
while (true)
{
Mat Frame;//创建了一个Mat对象
cap >> Frame;//摄像头信息读入到对象中
namedWindow("frame", 0);//新建了一个窗口;0:可自由调节大小;;1.不可调节;
imshow("frame", Frame);//在frame窗口中输出对象
waitKey(0);//显示完第一帧后等待10毫秒显示下一帧
}
*/
/*
Mat imggray=imread("123.jpg",0);//创建一个对象并将图片读入,图片必须在同目录下
//1表示彩色图,0为灰色图
cvtColor(imggray,imggray,CV_RGB2GRAY );//将彩色图转为黑白图
cout << (int)imggray.at<uchar>(1, 1) << endl;//读出imggray的第一行第一列像素值转为int型输出
imshow("123", imggray);//在123窗口中输出图片
waitKey(0);//第一帧后等待0毫秒,即无穷,表示只显示第一帧
*/
/*
Mat image = Mat::eye(5, 5, CV_64FC1);//创建5乘5的对角矩阵,数据类型为double
cout << image << endl;//输出该矩阵
Mat imgone = Mat::ones(5, 5, CV_64FC1);//创建5乘5的单位矩阵,数据类型为double
Mat sum = image + imgone;//两矩阵相加
cout << sum << endl;//输出相加后的矩阵;
*/
/* //普通方法求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;
namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);
cout << "row" << Frame.rows << "col" << Frame.cols << endl;//输出Frame行和列的大小
Mat dimg = Mat(Frame.rows, Frame.cols-2,CV_8UC1);//用于存放对Frame X方向求导后的图像
//边缘两列不求导,故列数减2
for (int i = 0; i < Frame.rows; i++)//外层循环,对行循环,从0到Frame.rows-1行
{
for (int j = 1; j < Frame.cols-1; j++)//内层循环,对列循环,从第1列到Frame.cols-2列
{
dimg.at<uchar>(i, j - 1) = Frame.at<uchar>(i, j - 1) - Frame.at<uchar>(i, j + 1);
//求导
}
}
imshow("123",dimg);//输出求导后的图像
waitKey(10);
}
*/
/* //卷积方式实现求导
VideoCapture cap(0);
while (true)
{
Mat Frame;
cap >> Frame;
namedWindow("123", 0);
cvtColor(Frame, Frame, CV_RGB2GRAY);
cout << "row" << Frame.rows << "col" << Frame.cols << endl;
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;//模板元素为1,0,-1
for (int i = 0; i < Frame.rows; i++)//对Frame行循环
{
for (int j = 1; j < Frame.cols - 1; j++)//对Frame列循环
{
double sum = 0;
for (int m = 0; m < model.rows; m++)//对模板的行循环
{
for (int n = 0; n < model.cols; n++)//对模板的列循环
{
sum += (double)Frame.at<uchar>(i + m, j - 1 + n)*model.at<double>(m, n);
//对应位置的数相乘放到sum中
}
}
dimg.at<uchar>(i, j - 1) = (uchar)sum;//sum的值再赋给dimg的每个元素
}
}
imshow("123", dimg);//输出
waitKey(10);
}
*/
/*//高斯模糊
double sigma = 20;
Mat gauss(5, 5, CV_64FC1);//创建高斯模板
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);
//左右两列上下两行无法进行卷积运算,故各减4
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-2 + m, j-2+ n)*gauss.at<double>(m, n);
//与卷积求导同理
}
}
dimg.at<uchar>(i-2,j-2) = (uchar)sum;
}
}
namedWindow("frame", 0);
imshow("a", frame);
imshow("frame", dimg);
waitKey(10);
}
*/
VideoCapture cap(0);
while (true)
{
Mat frame, frame1, frame2, frame3;
cap >> frame;
cvtColor(frame, frame, CV_RGB2GRAY);
//API调用
GaussianBlur(frame, frame1, cvSize(5, 5), 10, 10);//高斯模糊
Canny(frame, frame2, 100, 100);//边缘检验
Sobel(frame, frame3, 0, 1, 1);//边缘检验
imshow("1", frame1);
imshow("2", frame2);
imshow("3", frame3);
waitKey(10);
}
system("pause");
}