求职招聘网站建设投标书,打开百度地图导航,网站挂广告,wordpress博客统计代码打开视频或摄像头
打开指定视频 /*VideoCapture(const String filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference#xff1a;读取数据时设置的属性*/
VideoCapture video; //定义一个空的视频对象
video.open(H:/BaiduNetdiskDownlo…打开视频或摄像头
打开指定视频 /*VideoCapture(const String filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference读取数据时设置的属性*/
VideoCapture video; //定义一个空的视频对象
video.open(H:/BaiduNetdiskDownload/01.mp4);
// 判断视频有没有成功打开if (!video.isOpened()) {cout 视频打开失败;return -1;}打开摄像头
VideoCapture video(1); //打开一个摄像头视频的相关操作
通过get获取视频数据 将视频流赋值给mat对象 Mat mat;video mat; bool isColor (mat.type() CV_8UC3); //判断视频是否为3通道彩色输出视频的帧率
VideoWriter 视频写入 filename保存视频的地址和文件名包含视频格式 fourcc压缩帧的4字符编解码器代码 fps保存视频的帧率即视频中每秒图像的张数 framSize视频帧的尺寸 isColor保存视频是否为彩色视频 VideoWriter writer;int codec VideoWriter::fourcc(M, J, P, G); //选择MJPG的编码格式double fps 25.0; //设置视频的帧率string filename file.avi; // 视频的名和格式writer.open(filename, codec, fps, mat.size(),isColor); //创建保存文件的视频流if (!writer.isOpened()) { // 判断视频流是否正常打开cout 视频打开失败;return -1;}捕捉摄像头中内容写入倒视频中 #include iostream
#include opencv2/opencv.hpp
#include opencv2/core.hpp
#include opencv2/imgcodecs.hpp
#include opencv2/highgui.hpp#pragma comment(lib,opencv_world4100d.lib)using namespace std;
using namespace cv;int main(int argc, char** argv) {// 创建一个 VideoCapture 对象参数 0 表示默认摄像头VideoCapture cap(0);// 检查摄像头是否成功打开if (!cap.isOpened()) {std::cerr Error: Could not open the camera. std::endl;return -1;}// 获取摄像头的帧宽度和高度int frame_width static_castint(cap.get(cv::CAP_PROP_FRAME_WIDTH));int frame_height static_castint(cap.get(cv::CAP_PROP_FRAME_HEIGHT));double fps cap.get(cv::CAP_PROP_FPS);// 帧率不能小于0if (fps 0) fps 30.0;std::string output_file F:/output.avi;int fourcc cv::VideoWriter::fourcc(X, V, I, D);cv::VideoWriter writer(output_file, fourcc, fps, cv::Size(frame_width, frame_height));if (!writer.isOpened()) {std::cerr Error: Could not open the output video file for write. std::endl;return -1;}// 创建一个窗口来显示视频cv::namedWindow(Camera Feed, cv::WINDOW_AUTOSIZE);while (true) {cv::Mat frame;// 捕获一帧cap frame;// 检查帧是否为空if (frame.empty()) {std::cerr Error: Blank frame grabbed. std::endl;break;}// 显示帧cv::imshow(Camera Feed, frame);writer.write(frame);// 检查是否按下了 q 键来退出循环if (cv::waitKey(10) q) {break;}}// 释放摄像头并关闭所有窗口cap.release();writer.release();cv::destroyAllWindows();return 0;
}颜色空间转换
三种存取数据的区间
8U–存储0-255的数据类型32F–存储0-1将0-1区间映射为0-255大于1的部分映射为白色小于0的部分映射为黑色64F–存储0-1 convertTo m:输出图像 rtype转换后数据类型 alpha缩放系数 beta平移系数 转换公式alpha*Ix,y beta // 将0-255的图像转为0-1mat.convertTo(mat2, CV_32F, 1/255.0, 0);RGB转灰度图公式GrayR0.3G0.59B*0.11
图像格式转换cvtColor src待转换颜色模型的原始图像 dst:转换颜色模型后的目标图像。 code:颜色空间转换的标志如由RGB空间到HSV空间。 dstCn:目标图像中的通道数如果参数为0则从src和代码中自动导出通道数。 Mat HSV;// 将RGB转为HSVcvtColor(mat, HSV, COLOR_BGR2HSV);图像转换
CV_BGR2GRAY将BGR格式的图像转换为灰度图。
CV_BGR2HSV将BGR格式的图像转换为HSV格式。
CV_BGR2LAB将BGR格式的图像转换为LAB格式。
CV_BGR2Luv将BGR格式的图像转换为Luv格式。
CV_BGR2RGB将BGR格式的图像转换为RGB格式注意OpenCV默认读取的图像是BGR格式所以这个函数在某些情况下很有用。
CV_BGR2XYZ将BGR格式的图像转换为XYZ格式。
CV_BGR2YUV将BGR格式的图像转换为YUV格式。
CV_BGR2YCrCb将BGR格式的图像转换为YCrCb格式。通道管理
split多通道分离 split( InputArray m, //可以输入mat型 OutputArrayOfArrays mv ) m待分离的多通道图像 mv分离后的单通道图像为向量vector形式 merge多通道合并 merge( InputArrayOfArrays mv, OutputArray dst ) mv:需要合并的图像向量vector其中每个图像必须拥有相同的尺寸和数据类型 dst合并后输出的图像通道数等于所有输入图像的通道数的总和 合并两个矩阵取同一位置中较小的值 min( InputArray src1, InoytArray sec2, OutputArray dst ) 合并两个矩阵取同一位置中较大的值max( InputArray src1, InoytArray sec2, OutputArray dst ) 找出矩阵中的最值 minMaxLoc( InputArray src, //输入单通道矩阵 CV_OUT double* minVal, //指向最小值的指针如果不需要则使用NULL CV_OUT double* maxVal 0, //指向最大值的指针如果不需要则使用NULL CV_OUT Point* minLoc 0, //指向最小值位置的指针如果不需要则使用NULL CV_OUT Point* maxLoc 0, //指向最大值位置的指针如果不需要则使用NULL InputArray mask noArray() //掩码矩阵用于标记寻找上述四个值的范围参数默认值为noArray表示寻找范围是矩阵中所有数据 ) 与或非运算
非运算
bitwise_not( //非运算InputArray src, //输入矩阵OutputArray dst, //输出矩阵InputArray mask noArray() //掩码区域
)与运算 bitwise_and( //与运算InputArray src1, //输入矩阵1InputArray src2, //输入矩阵2OutputArray dst, // 输出矩阵InputArray mask noArray());//掩码矩阵或运算
bitwise_or( //或运算InputArray src1, //输入矩阵1InputArray src2, //输入矩阵2OutputArray dst, // 输出矩阵InputArray mask noArray());//掩码矩阵
)阈值化二值化 threshold( //图像二值化 InputArray src, //待二值化图像图像只能是CV_8U和CV_32F两种数据类型 OutputArray dst, //二值化后的图像 double thresh, //阈值 double maxval, //二值化过程中的最大值非必须参数 int type //二值化方式 );
adaptiveThreshold( //自适应阈值化只支持灰度图InputArray src, //待二值化图像OutputArray dst, //输出图像double maxValue, //二值化的最大值int adaptiveMethod, //自适应确定阈值的方法分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_Cint thresholdType, //选择二值化方法int blockSize, //自适应确定阈值的像素邻域大小double C); //从平均值或者加权平均值中减去的常数LUT查找表 LUT( InputArray src, //输入图像类型只能是8U InputArray lut, //256个像素的查找表如果为多通道通道数必须和输入图像通道数相同 OutputArray dst //输出矩阵数据类型和查找表相同 );
图像尺寸缩放、翻转、拼接
图像尺寸缩放
resize(InputArray src, //输入图像OutputArray dst, //输出图像Size dsize, //输出图像的尺寸double fx 0, //水平轴的比例因子变为原来的几倍double fy 0, //垂直轴的比例因子int interpolation INTER_LINEAR //插值方法INTER_AREA最近邻插值,INTER_LINEAR双线性插值,INTER_CUBIC三线性插值
);flip( 图像翻转InputArray src, //输入图像OutputArray dst, //输出图像int flipCode //翻转方式标志数值大于0表示绕y轴翻转数值等于0表示围绕x轴翻转数值小于0表示围绕两个轴翻转
);
resize(INTER_AREA,INTER_LINEAR,INTER_CUBIC)hconcat(//横向拼接InputArray src1, // 输入图像 InputArray src2, //输入图像需要两个输入图像高度相同OutputArray dst //输出图像
) vconcat(//纵向拼接InputArray src1, // 输入图像 InputArray src2, //输入图像需要两个输入图像高度相同OutputArray dst //输出图像
)仿射变换和旋转
// 仿射变换由平移缩放旋转翻转和错切组合得到也叫三点变换warpAffine( 仿射变换InputArray src, //输入图像OutputArray dst, //输出图像InputArray M, //2*3变换矩阵仿射变换矩阵Size dsize, //输出图像尺寸int flags INTER_LINEAR, //插值方法标志int borderMode BORDER_CONSTANT, //像素边界外推方法的标志const Scalar borderValue Scalar()); //填充边界使用的数值默认情况下为0像素边界外推方法 BORDER_CONSTANT 0,用特定值填充//! iiiiii|abcdefgh|iiiiiii BORDER_REPLICATE 1,两端复制填充//! aaaaaa|abcdefgh|hhhhhhh BORDER_REFLECT 2, 倒叙填充//! fedcba|abcdefgh|hgfedcb BORDER_WRAP 3, 正序填充//! cdefgh|abcdefgh|abcdefg BORDER_REFLECT_101 4, 不包含边界值倒叙填充//! gfedcb|abcdefgh|gfedcba BORDER_TRANSPARENT 5, //随机填充! uvwxyz|abcdefgh|ijklmno BORDER_REFLECT101 BORDER_REFLECT_101, //!与BORDER_REFLECT_101相同 BORDER_DEFAULT BORDER_REFLECT_101, //!与BORDER_REFLECT_101相同 BORDER_ISOLATED 16 //! 不关心感兴趣区域之外的部分
c中并没有直接进行图像旋转的函数需要求取一个旋转变换的仿射矩阵通过仿射矩阵实现图像的旋转 getRotationMatrix2D( 图像旋转返回一个2*3的矩阵 Point2f center, 图像旋转的中心位置 double angle, 图像旋转的角度正值为逆时针旋转 double scale 两个轴的比例因子可以实现旋转过程中的图像缩放不缩放输入1 ); 图像旋转的计算公式 三点对应方式计算仿射变换矩阵 getAffineTransform( const Point2f src[], 原图像的三个点坐标 const Point2f dst[] 仿射变换后的三个点坐标 );
透视变换透视投影又叫四点变换 从一个点出发把一个平面内人形状投影到另一个平面上 计算公式 getPerspectiveTransform( 计算透视变换矩阵 const Point2f src[], 原图像中的三个坐标 const Point2f dst[], 目标图像中的三个像素坐标 int solveMethod DECOMP_LU 计算透视变换矩阵的方法 ); 计算透视变换矩阵的方法DECOMP_LU 0, 最佳主轴元素的高斯消元法 DECOMP_SVD 1, 奇异值分解法 DECOMP_EIG 2, 特征值分解法 DECOMP_CHOLESKY 3, Cholesky分解法DECOMP_QR 4, QR分解法DECOMP_NORMAL 16 使用正规方程公式可以去前面的标志一起使用warpPerspective( 透视变换函数InputArray src, 输入图像OutputArray dst,InputArray M, 3*3的透视变换矩阵Size dsize, 输出图像尺寸int flags INTER_LINEAR, 插值方式 int borderMode BORDER_CONSTANT, 像素边界外推方法的标志 const Scalar borderValue Scalar() 填充边界使用的数值默认为0);绘制图形
绘制直线
line( InputOutputArray img, //绘制的图像Point pt1, //起点坐标Point pt2, //终点坐标const Scalar color, //颜色int thickness 1, //宽度int lineType LINE_8, //边界类型int shift 0 //中心坐标的半径数值中的小数点数
); 边界类型 FILLED -1, 填充型LINE_4 4, //! 4-connected line 四连接LINE_8 8, //! 8-connected line 8连接LINE_AA 16 //! antialiased line绘制圆形
circle(InputOutputArray img, Point center, int radius, 半径长度const Scalar color, int thickness 1, 线的宽度-1为绘制实心圆int lineType LINE_8,int shift 0
);绘制椭圆
ellipse(InputOutputArray img, Point center,Size axes,double angle, //椭圆旋转的角度double startAngle, 起始角度double endAngle, 终止角度const Scalar color,int thickness 1,int lineType LINE_8, int shift 0);矩形绘制 rectangle(InputOutputArray img,Point pt1, Point pt2,const Scalar color, int thickness 1,int lineType LINE_8, int shift 0);绘制多边形
fillPoly(InputOutputArray img, const Point** pts, 所有顶点坐标可以是多重数组绘制多个多边形const int* npts, 定点数int ncontours, 绘制的多边形的个数const Scalar color, int lineType LINE_8, int shift 0,Point offset Point());绘制文字
putText(InputOutputArray img, const String text, Point org, //文字字符串左下角像素的坐标int fontFace, double fontScale, Scalar color,int thickness 1, int lineType LINE_8,bool bottomLeftOrigin false
);ROI分割和拷贝
img(Range(int start, //区间的开始int end; //区间的结束 ),Range(int start, //区间的开始int end; //区间的结束 )
)Rect_(_Tp _x, //左上角x坐标_Tp _y, //左上角y坐标_Tp _width, //宽_Tp _height) //高矩阵存储图 浅拷贝只拷贝矩阵头 mat1mat2 深拷贝拷贝所有内容
cv::copyTo
copyTo(InputArray src,OutputArray dst, InputArray mask);Mat::copyToMat mat1;mat.copyTo(OutputArray dst,InputArray mask) const图像金字塔
高斯图像金字塔不断下采样 拉普拉斯金字塔第k层的高斯图像下采样再上采样然后上采样和第k层的高斯图像求和得到拉普拉斯金字塔
pyrDown( //下采样InputArray src, OutputArray dst,const Size dstsize Size(), int borderType BORDER_DEFAULT //填充方式);pyrUp( 上采样InputArray src,OutputArray dst,const Size dstsize Size(), int borderType BORDER_DEFAULT);创建滑动条和鼠标监控
创建滑动条
createTrackbar(const String trackbarname, const String winname, //创建滑动条的窗口的名称int* value, //反应当前滑块的位置int count, //最大值TrackbarCallback onChange 0, //回调函数void* userdata 0 //传递给回调函数的参数);案例代码
Mat img;void callBack(int value, void*) {float a value / 100;Mat img2 img * a;imshow(img, img2);
}int main()
{img imread(H:/1732413934315.png);namedWindow(img);imshow(img, img);int value 100;createTrackbar(滑动条名称,img,value,200,callBack,0);waitKey(0);return 0;
}鼠标监控
setMouseCallback( 鼠标时间响应函数const String winname, MouseCallback onMouse, void* userdata 0)MouseCallback(int event, 鼠标响应事件标志瞬间动作int x, int y, int flags, 鼠标相应标识长时间的操作void* userdata 传递给回调函数的可选参数)鼠标响应时间标志enum MouseEventTypes {EVENT_MOUSEMOVE 0, //! 鼠标指针再窗口上移动EVENT_LBUTTONDOWN 1, //!按下鼠标左键EVENT_RBUTTONDOWN 2, //! 按下鼠标右键EVENT_MBUTTONDOWN 3, //! 按下鼠标中键EVENT_LBUTTONUP 4, //! 释放鼠标左键EVENT_RBUTTONUP 5, //! 释放鼠标右键EVENT_MBUTTONUP 6, //! 释放鼠标中键EVENT_LBUTTONDBLCLK 7, //! 双击鼠标左键EVENT_RBUTTONDBLCLK 8, //! 双击鼠标右键EVENT_MBUTTONDBLCLK 9, //! 双击鼠标中键EVENT_MOUSEWHEEL 10,//! 正值表示向前滚动负值表示向后滚动EVENT_MOUSEHWHEEL 11 //! 正值表示向左滚动负值表示向右滚动鼠标相应标识EVENT_FLAG_LBUTTON 1, //! 按住左键拖拽EVENT_FLAG_RBUTTON 2, //! 按住右键拖拽EVENT_FLAG_MBUTTON 4, //! 按住中键拖拽EVENT_FLAG_CTRLKEY 8, //! 按下ctrl键EVENT_FLAG_SHIFTKEY 16,//! 按下SHIFT键EVENT_FLAG_ALTKEY 32 //! 按下ALT键normalize( 归一化InputArray src, OutputArray dst, double alpha 0, double beta 1, int norm_type NORM_MINMAX, int dtype -1, InputArray mask noArray()
);NORM_MINMAX: 数组的数值被线性变换到alpha和beta之间通常是0到1。NORM_L2 : 归一化后的值 像素值 / sqrt(所有像素值平方和)NORM_INF : 归一化后的值 像素值 / 最大绝对值像素值NORM_L1 : 归一化后的值 像素值 / (所有像素值绝对值的和)calcHist( 统计图像像素const Mat* images,int nimages,const int* channels, //需要统计哪些区域InputArray mask,SparseMat hist, int dims,const int* histSize, const float** ranges, //每个图像通道中灰度值的取值范围bool uniform true, //直方图是否均匀bool accumulate false //是否累积统计直方图是否分别统计每个通道
);equalizeHist( 直方图均衡化InputArray src, 输入图像必须是8UC1OutputArray dst);LUTLUT(图像直方图匹配将图像分布映射为指定分布InputArray src, InputArray lut, 变换矩阵OutputArray dst
);matchTemplate(InputArray image, 只能为8U或32F格式两个输入图像类型必须相同InputArray templ,OutputArray result,int method, 匹配方法 InputArray mask noArray());匹配方法
TM_SQDIFF 0, 平方差匹配法 TM_SQDIFF_NORMED 1, 归一化平方差匹配法 TM_CCORR 2, 相关匹配法TM_CCORR_NORMED 3, 归一化相关匹配法 TM_CCOEFF 4, 系数匹配法 TM_CCOEFF_NORMED 5 归一化相关系数匹配法求积分图像
integral(InputArray src, OutputArray sum, 标准求和积分图像OutputArray sqsum, 平方求和积分图像OutputArray tilted, 倾斜45°积分图像 int sdepth -1, 标准求和和倾斜求和积分图像输出类型 int sqdepth -1 平方求和积分图像数据类型
);漫水填充算法 1. 选择填充算法步骤 2. 以种子点为中心判断4邻域或8邻域的像素值与种子点像素值的差值将差值小于阈值的像素点添加进区域内 3. 将新加入的像素点作为新的种子点反复执行第二步知道没有新的像素点杯添加进区域
floodFill( InputOutputArray image, InputOutputArray mask,Point seedPoint, Scalar newVal, 归入种子点区域内像素点的像素值CV_OUT Rect* rect 0, 种子点漫水填充区域的最小矩形边界 Scalar loDiff Scalar(), 添加进种子点区域条件的下界差值Scalar upDiff Scalar(), 添加进种子点区域条件的上界差值int flags 4 漫水填充方法
);分水岭分割算法
1. 首先对图像像素的灰度级进行排序确定灰度值较小的像素点改像素点即为开始注水点
2. 淹没过程对每个最低点开始不断注水不断掩膜周围的像素点不同注水处的水汇集在一起形成分割线watershed(InputArray image, InputOutputArray markers
);角点检测
Harris角点 首先定义一个矩形区域计算区域内像素值之和移动区域计算像素值之和如果变化大认为是角点cornerHarris(Harris角点检测InputArray src, OutputArray dst, int blockSize, 邻域大小int ksize, sobel算子的半径 double k, 权重系数int borderType BORDER_DEFAULT
);drawKeypoints(角点绘制InputArray image,const std::vectorKeyPoint keypoints, 关键点左边和方向InputOutputArray outImage,const Scalar color Scalar::all(-1),DrawMatchesFlags flags DrawMatchesFlags::DEFAULT
);