文章目录
配置环境变量
添加环境变量
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