opencv学习之路(一)

配置环境变量

添加环境变量

D:\opencv\build\x64\vc15\bin

打开visual studio 2017
文件->新建->项目->选择空项目 确定即可
视图->其他窗口->属性管理器
在Debug|x64 中双击Microsoft.Cpp.x64.user

1.VC++目录中的包含目录

在这里插入图片描述

2.1.VC++目录中的库目录

在这里插入图片描述

3.在链接器中的输入中的附加依赖项输入

在这里插入图片描述
最重要一点是将debug调成x64,到此配置结束。

加载修改保存图像

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("E:/visualstudio/testopencv2/111.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	namedWindow("output window", CV_WINDOW_AUTOSIZE);
	Mat output_image;
	cvtColor(src, output_image, CV_BGR2HLS);
	imshow("output window", output_image);
	

	waitKey(0);
	return 0;
}

在这里插入图片描述

imread()函数

函数原型:
Mat imread( const string& filename, int flags=1 );
1)第一个参数,需要填入图片路径名,支持如下格式:
Windows位图: *.bmp, *.dib
JPEG文件: *.jpeg, *.jpg, *.jpe
JPEG2000文件: *.jp2
PNG图片: *.png
便携文件格式: *.pbm, *.pgm, *.ppm
Sun rasters光栅文件: *.sr, *.ras
TIFF文件: *.tiff, *.tif
2)第二个参数,指定加载图像的颜色类型,默认为1:
在这里插入图片描述

namedWindow()函数

函数原型:
namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
1)第一个参数,设置作为标识的窗口名称
2)第二个参数,窗口显示方式,取值如下:

Normal:正常大小显示,用户可以改变窗口大小
Autosize: 根据图像大小自动调整,用户不能手动改变窗口大小
OpenGL: 支持openGL
在这里插入图片描述

imshow()函数

函数原型:
imshow(const string& winname, InputArray mat);
1)第一个参数,设置需要显示的窗口名称
2)第二个参数,填写需要显示的图像

imwrite()函数

函数原型:
bool imwrite( const string& filename, InputArray img,const vector& params=vector());
1)第一个参数,设置保存的文件名,需填写后缀,如"1.bmp"
2)第二个参数,要保存的Mat类型图像数据
3)第三个参数,表示特定格式保存的参数编码,一般采用默认值不填写

1).empty() 判断文件读取是否正确
2).rows 获取图像行数(高度)
3).cols 获取图像列数(长度)
4).channels() 获取图像通道数
5).depth() 获取图像位深度

waitKey()函数

函数原型:
int waitKey(int delay = 0);
1)第一个参数,如果delay>0, 表示等待delay毫秒之后结束
如果delay=0, 表示无限等待,直到有按键按下结束
2)返回值为对应按下按键的ASCII码值,如Esc的ASCII码为27

摄像头 视频读取 写入


#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;


void main()
{
	VideoCapture cap;
	//cap.open("E:\\2.mov"); //打开视频

	//Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	//VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, size0, true);
	//VideoWriter writer("E:\\out.avi", -1, cap.get(CV_CAP_PROP_FPS), size0, false);//-1是指让自己选择系统提供的编码方式。


	cap.open(0); //打开摄像头
	//VideoCapture cap("E:\\2.avi");
	//cap.open("http://www.laganiere.name/bike.avi");
	if (!cap.isOpened())
		return;

	int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
	int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
	int frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
	int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数

	cout << "视频宽度=" << width << endl;
	cout << "视频高度=" << height << endl;
	cout << "视频总帧数=" << totalFrames << endl;
	cout << "帧率=" << frameRate << endl;



	Mat frame,frame1;
	while (1)
	{
		cap >> frame;
		Canny(frame, frame1, 30, 100);
		//cvtColor(frame, frame, CV_BGR2HSV);
		if (frame.empty())
			break;
		//writer << frame;
		//writer.write(frame);
		//cap.read(frame);
		imshow("video", frame1);
		if (waitKey(20) > 0)
			break;
	}
	cout << "write end!";
	cap.release();
	destroyAllWindows();
}

实例应用一

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;

void main()
{
	///批量读取图片(有序)
	/*char filename[50];
	char winName[50];
	Mat srcImg;
	for(int i = 1; i<100; i++)
	{
		sprintf(filename, "E:\\pic\\%d.bmp", i);
		sprintf(winName, "NO--%d", i);
		srcImg = imread(filename);

		if(srcImg.empty())
			break;
		imshow(winName, srcImg);
	}

	waitKey(0);
	destroyAllWindows();*/

	///视频分解成图片
/*
	Mat frame;
	char outfile[50];

	VideoCapture cap("E:\\2.avi");
	if(!cap.isOpened())  //打开失败
		return;

	int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //获取视频总帧数

	for(int i = 1; i<=totalFrame; i++)
	{
		cap>>frame;
		if(frame.empty())
			break;
		sprintf(outfile, "E:\\pic\\%d.bmp", i);
		imwrite(outfile, frame);
		imshow("video", frame);
		waitKey(15);
	}
	cap.release();
	destroyAllWindows(); */

	///图片合成视频

	VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(568, 320), true);
	VideoCapture cap;
	char filename[50];
	Mat frame;
	for(int i = 1; i<644; i++)
	{
		sprintf(filename, "E:\\pic\\%d.bmp", i);
		//frame = imread(filename);
		cap.open(filename);
		if(!cap.isOpened())
			break;
		cap>>frame;
		if(frame.empty())
			break;
		writer<<frame;
	}
	
	cout<<"write end!"<<endl;
	destroyAllWindows();



}

Mat

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main() {
	Mat src = imread("E:/visualstudio/Project1/build/0.jpg",0);
	cout << src<<endl;
	int rows = src.rows;
	int cols = src.cols;
	printf("rows:%d cols:%d\n", rows, cols);

	cout << "原图" << endl;
	Mat src1 = imread("E:/visualstudio/Project1/build/0.jpg");
	const uchar* firstRow = src1.ptr<uchar>(0);
	imshow("src1", src1);
	
	cout << src1 << endl;
	printf("first pixel value:%d\n", *firstRow);
	int rows1 = src1.rows;
	int cols1 = src1.cols;
	printf("rows1:%d cols1:%d\n", rows1, cols1);
	cout << src1.size()<<endl;
	cout << src1.type() << endl;


	Mat M(3,3, CV_8UC3, Scalar(0, 0, 255));
	cout << "M=" << endl << M << endl;
	imshow("M", M);


	Mat N(3, 3, CV_8UC1, Scalar(56));
	cout << "N=" << endl << N << endl;
	imshow("N", N);


	cout << "创建多维数组:" << endl;
	/*Mat L;
	L.create(4, 3, CV_8UC2);
	L = Scalar(0, 127);
	cout << "M=" << endl << "" <<L<< endl << endl;
	imshow("L", L);*/
	Mat m1;
	m1.create(src1.size(), src1.type());
	m1 = Scalar(0, 0, 255);
	imshow("output", m1);

	//定义小数组
	Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	cout << "C=" << endl << "" << C << endl;
	imshow("C", C);

	Mat csrc;
	Mat kernel=(Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, csrc, -1, kernel);

	Mat m2 = Mat::eye(2, 2, CV_8UC1);
	cout << "m2=" << endl << m2 << endl;
	imshow("output", m2);
	waitKey(0);
}

对比度亮度调整与通道分离

#include "opencv2/opencv.hpp"
#include <vector>
using namespace std;
using namespace cv;

//#define WIN_NAME "输出图像"
//Mat srcImg;
//Mat dstImg;
//int Contrase_Value = 20;
//int Bright_Value = 20;
//
//void OnChange(int, void*)
//{
//	for(int i = 0; i<srcImg.rows; i++)
//	{
//		for(int j = 0; j<srcImg.cols; j++)
//		{
//			dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);
//			dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[1] + Bright_Value);
//			dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[2] + Bright_Value);
//		}
//	}
//	imshow("原图", srcImg);
//	imshow(WIN_NAME, dstImg);
//}

void main()
{
	//srcImg = imread("1.jpg");
	//dstImg = Mat::zeros(srcImg.size(), srcImg.type());
	Mat::zeros(); //将矩阵元素都置为0
	Mat::ones(); //将矩阵元素都置为1
	//namedWindow(WIN_NAME, CV_WINDOW_AUTOSIZE);

	//createTrackbar("对比度", WIN_NAME, &Contrase_Value, 300, OnChange, 0);
	//createTrackbar("亮   度", WIN_NAME, &Bright_Value, 200, OnChange, 0);

	//OnChange(Contrase_Value, 0); //回调函数初始化
	//OnChange(Bright_Value, 0);

	//waitKey(0);

	Mat img = imread("E:/visualstudio/Project1/build/c.jpg");
	Mat dst;
	vector<Mat> channels;
	cout << "img" << img << endl;

	split(img, channels);
	Mat blueChannel = channels.at(0);
	Mat greenChannel = channels.at(1);
	Mat redChannel = channels.at(2);


	/*threshold(blueChannel, blueChannel, 200, 255, THRESH_BINARY);
	threshold(greenChannel, greenChannel, 200, 255, THRESH_BINARY);
	threshold(redChannel, redChannel, 200, 255, THRESH_BINARY);*/

	/*merge(channels, dst);*/
	namedWindow("Blue", CV_WINDOW_AUTOSIZE);
	imshow("Blue", blueChannel);
	imshow("green", greenChannel);
	imshow("red", redChannel);
	cout << "Blue" << blueChannel << endl;
	cout << "green" << greenChannel << endl;
	cout << "red" << redChannel << endl;

	/*imshow("dst", dst);*/
	waitKey(0);

}

c.jpg
在这里插入图片描述
Blue
在这里插入图片描述
green
在这里插入图片描述
red
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值