示例代码下载位置:
https://github.com/shimat/opencvsharp_samples/
错误 CS1617 /langversion 的选项“8.0”无效。
解决方法:
https://www.cnblogs.com/mq0036/p/12205276.html
1.ArucoSample
aruco模块基于ArUco库,这是一个检测二进制marker的非常流行的库。用于姿态估计。
参考:https://blog.csdn.net/u010260681/article/details/77089657
参考:https://docs.opencv.org/4.5.1/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa
初始化MarkerId。
src=读取有Aruco图像的图片。
建立检测标记过程的参数:
CornerRefinementMethod 角细化方法=使用角的亚像素精度精炼角的位置。
CornerRefinementWinSize 角细化窗口大小=9
定义marker字典dictionary=Dict4X4_1000。由1000个marker组成的,每个marker的大小为4×4bits
基本标记(marker)检测 out var corners, out var ids, out var rejectedPoints
detectedMarkers=创建阵列和基础数据的src的完整副本。
在detectedMarkers上画图像中检测到的标记
查找ids数组中四个标记的索引。我们将在corners数组中使用相同的索引来查找每个标记的corners。
确保我们找到了四个标记,否则返回。
从左上角开始按顺时针方向存储标记的角的位置。
创建传递给GetPerspectiveTransform的坐标。
transform =从四对对应点计算透视变换。(GetPerspectiveTransform)
normalizedImage=应用透视转换transform图像(使用指定的矩阵变换)。
显示原图像;
显示detectedMarkers;
显示normalizedImage;
2.BgSubtractorMOG
基于高斯混合的背景/前景分割算法示例
读取视频文件到capture
建立基于高斯混合的背景/前景分割算法模型mog
循环:
读取视频帧frame
计算前景掩码fg
显示frame
显示fg
3.BinarizerSample
二进制阈值示例
参考:https://docs.opencv.org/4.5.1/df/d6c/ximgproc_8hpp.html
src =读取Binarization灰度图片
新建四个Mat niblack sauvola bernsen nick
(对应四个二进制方法:
[178]Wayne Niblack. An introduction to digital image processing. Strandberg Publishing Company, 1985.
韦恩·尼布莱克数字图像处理的介绍。斯特兰德伯格出版公司,1985年。
[206]Jaakko Sauvola, Tapio Seppanen, Sami Haapakoski, and Matti Pietikainen. Adaptive document
binarization. In Document Analysis and Recognition, 1997., Proceedings of the Fourth International
Conference on, volume 1, pages 147–152. IEEE, 1997.
雅科·索沃拉、塔皮奥·塞帕宁、萨米·哈帕科斯基和马蒂·皮耶蒂凯宁。自适应文档二进制。在1997年的文件分析
和确认中,第四次国际会议纪要,第1卷,第147-152页。IE,1997年。
[267]Christian Wolf and J-M Jolion. Extraction and recognition of artificial text in multimedia
documents. Pattern Analysis & Applications, 6(4):309–326, 2004.
克里斯蒂安 · 沃尔夫和 J - m 乔利翁多媒体文档中人工文本的提取和识别。模式分析与应用, 6 (4):
309-326, 2004.
[122]Khurram Khurshid, Imran Siddiqi, Claudie Faure, and Nicole Vincent. Comparison of niblack
inspired binarization methods for ancient documents. In IS&T/SPIE Electronic Imaging, pages 72470U–72470U.
International Society for Optics and Photonics, 2009.
库拉姆·库尔希德、伊姆兰·西迪奇、克劳迪·福雷和妮可·文森特。比较黑黑启发的古代文献的二元化方法。
在IS&T/SPIE 电子成像中,第 72470U-72470U. 国际光学和光子学会,2009 年。)
核大小=51
sw=秒表类实例。
使用 Niblack 技术对输入图像src执行阈值生成niblack图像。显示生成使用的时长。
使用 sauvola 技术对输入图像src执行阈值生成sauvola图像。显示生成使用的时长。
使用 bernsen 技术对输入图像src执行阈值生成bernsen图像。显示生成使用的时长。(已弃用)
使用 nick 技术对输入图像src执行阈值生成nick图像。显示生成使用的时长。
sw.Restart();
CvXImgProc.NiblackThreshold(src, wolf, 255, ThresholdTypes.Binary, kernelSize, -0.14, LocalBinarizationMethods.Wolf);
sw.Stop();
Console.WriteLine($"Wolf {sw.ElapsedMilliseconds} ms");
使用 wolf 技术对输入图像src执行阈值生成wolf图像。显示生成使用的时长。
(结果:
Niblack 20 ms
Sauvola 4 ms
Bernsen 2780 ms
Nick 2 ms
Wolf 11 ms)
4.BRISKSample
使用BRISK算法检索关键点。
参考:https://docs.opencv.org/4.5.1/de/dbf/classcv_1_1BRISK.html
gray=读取lenna灰度图
dst=读取lenna彩色图
建立BRISK算法类brisk
keypoints =检测图像gray中的要点。
画出要点
5.CaffeSample
学习如何使用opencv_dnn模块进行图像分类,使用来自Caffe模型动物园的 GoogLeNet 训练网络。
https://docs.opencv.org/4.5.1/d5/de7/tutorial_dnn_googlenet.html
protoTxt = @"Data\Text\bvlc_googlenet.prototxt";(模型结构)
caffeModel = "bvlc_googlenet.caffemodel";(模型参数?)
synsetWords = @"Data\Text\synset_words.txt";(类名称)
classNames=synsetWords分解的数组
下载Caffe模型到caffeModel(DownloadBytes("http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel");)
用protoTxt,caffeModel构建DNN网络(读取存储在caffeModel格式中的网络模型。)
img =读取space_shuttle.jpg
显示DNN网络各层名称
inputBlob =从图像创建四维点
通过DNN网络预测图片分类
DNN网络输入为inputBlob
prob=运行前传计算输出层的名称为prob。缺省情况下,整个网络运行正向传输。返回指定层的第一个输出blob
显示最可能的类ID和类名称
显示概率
显示按任意键退出。
6.ClaheSample
对比度受限的自适应直方图均衡化基类示例 (Contrast Limited Adaptive Histogram Equalization)
src =读取TsukubaLeft灰度图
dst1=对比度限制的阈值=20,均衡化灰度图像src的直方图
dst2=对比度限制的阈值=40,均衡化灰度图像src的直方图
dst3=设置直方图均衡化网格的大小为4×4。输入图像将被分割成大小相同的矩形贴图
显示src, dst1, dst2, dst3
7.ConnectedComponentsSample
连接组件示例
src=读取彩色图片shapes.png
gray=src转灰度图像
binary=gray阈值化结果
labelView=与src图像具有相同大小、深度和通道的Mat
rectView=binary转BGR图像
cc=计算标记为布尔图像的图像binary的连接组件。
(具有4路或8路连接的图像-返回N,标签总数[0,N-1],其中0表示背景标签。ltype指定输出标签图像类型,这是基于标签总数或源图像中像素总数的重要考虑因素。)
如 cc 标签总数小于等于1,退出
通过cc将标记绘制到labelView图像上
在rectView上绘制除背景外的红色连接框
用指定的blob对象过滤图像src,输出为filtered。
显示src,binary,labelView,rectView,filtered。
8.DFT, inverse DFT 傅里叶转换,逆傅里叶转换
参考 http://stackoverflow.com/questions/19761526/how-to-do-inverse-dft-in-opencv
img=读取lenna灰度图
m=img行数对应的最佳DFT大小。
n=img列数对应的最佳DFT大小。(在边界上添加零值)
在图像周围形成边框 (InputArray=src,OutputArray=padded,top=0,bottom=m-img.Rows,left=0,right=n-img.Cols, BorderTypes.Constant, Scalar.All(0))
complex=padded转换为32F,并并入相同大小的全0平面
对complex执行正向离散傅里叶变换生成dft。
dftPlanes=dft分解(planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)))
计算二维向量的大小。(向量的x坐标的浮点数组dftPlanes[0],向量的y坐标浮点数组dftPlanes[1];它必须有相同的大小,输出与x相同大小和类型的数组magnitude。)
magnitude切换到对数刻度
如果频谱的行数或列数为奇数,则裁剪频谱为spectrum
重新排列傅里叶图像的象限,使原点位于图像spectrum中心
spectrum,将带有浮点值的矩阵转换为CV_8U
显示img,spectrum
计算dft的逆傅里叶转换为inverseTransform
inverseTransform将带有浮点值的矩阵转换为CV_8U
显示inverseTransform
9.DnnSuperresSample
参考https://github.com/Saafke/FSRCNN_Tensorflow
TensorFlow实现加速超分辨率卷积神经网络的研究
包括预先训练的模型x2,x3和x4。对T91图像数据集进行了训练,并在General 100数据集上进行了细化。
受过训练的模型保存在.pb文件中。
构造DnnSuperResImpl类dnn,立即设置所需的模型(算法:"fsrcnn":(edsr,espcn,fsrcnn,lapsrn之一),规模:4)
dnn读取训练模型FSRCNN_x4.pb (读取FSRCNN_x2.pb 放大2倍,x4放大4倍)
src=读取彩色Mandrill
通过神经网络上采样到dst
显示src,dst
10.DrawBestMatchRectangle
绘制最佳匹配矩形
参考:https://stackoverflow.com/questions/51606215/how-to-draw-bounding-box-on-best-matches/51607041#51607041
类实现ORB(*oriented BRIEF*)关键点检测器和描述符提取器。
在@cite RRKB11中描述。该算法使用快速金字塔来检测稳定的关键点,使用快速或Harris响应来选择最强的特征,使用一阶矩来确定它们的方向,并使用BRIEF(其中随机点对(或k元组)的坐标根据测量的方向旋转)来计算描述符。
img1=读取彩色Match1
img2=读取彩色Match2 //两张有相同内容的图片。
orb为ORB类,保留的最多特征数为1000。
检测img1关键点并计算描述符,输出keyPoints1, descriptors1
检测img2关键点并计算描述符,输出keyPoints2, descriptors2
新建特征匹配BFMatcher类bf
用bf为descriptors1和descriptors2每个查询描述符找到一个最佳匹配(如果掩码为空)matches。
goodMatches = matches的x方向最好的10个值。
srcPts=keyPoints1中对应goodMatches的关键点
dstPts=keyPoints2中对应goodMatches的关键点
计算将srcPoints映射到dstPoints的最佳拟合透视变换homography。
img2BoundsTransformed=对多通道输入homography矩阵的每个元素进行透视变换
在view上画img2图像img2BoundsTransformed位置外框
11.FaceDetection
人脸检测
参考:http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html
haarCascade = 加载级联分类器 20x20正面面部探测器数据
lbpCascade =加载阳性样本数量3000、负样本数量1500。
利用 DetectFace 函数识别人脸
显示识别结果。
DetectFace(级联分类器)函数:
src =读取彩色Yalta图片
gray = src转灰度
faces =检测输入图像中不同大小的物体,最小30×30。检测到的对象作为矩形列表返回。
在检测到脸部的位置画圆
返回绘制结果
12.FaceDetectionDNN
要运行这个示例,首先下载这里可用的face模型:
https://github.com/spmallick/learnopencv/tree/master/FaceDetectionComparison/models
文件加到bin\\Data\\models\\文件夹
设置caffe模型文件位置、图像文件位置
frame =读取图像文件
构建DNN网络faceNet
blob =从图像frame创建四维点
faceNet设置输入为blob
detection =运行前传计算输出层的名称为detection_out。缺省情况下,整个网络运行正向传输。返回指定层的第一个输出blob
画外框
保存检测图片
13.FASTSample
imgSrc=读取彩色Lenna图像
imgGray=imgSrc转灰度图
keypoints =使用FAST算法检测得到的角点,中心像素和该像素周围圆圈像素之间的强度差的阈值=50。
在每个keypoints 画红点
显示结果图像。
14.FlannSample
显示"===== FlannTest ====="
features=10000×2 Mat 创建数据集:包含要索引的特征(点)的类型CV_ 32F的矩阵。
queryPoint = new Point2f(7777, 7777)
queries=[7777, 7777]
显示(7777, 7777)
显示"-----"
为给定数据集构造最近邻搜索索引。
显示最近邻居的数目顺序
显示找到的最近邻居的索引
显示找到的最近的邻居的距离
显示找到的最近的邻居的坐标
15.FREAKSample
利用FREAK算法检索关键点。
gray =读取Lenna灰度图像
dst =读取Lenna彩色
orb=为ORB类,保留的最多特征数为1000。
keypoints=通过orb检测的gray图像的特征点
freak=FREAK算法类
计算图像gray中关键点keypoints的描述符freakDescriptors。不能计算描述符的关键点被移除。
在dst上画出关键点
显示dst
16.HandPose
数据有误,运行报错
17.HistSample
直方图示例
参考:http://book.mynavi.jp/support/pc/opencv2/c3/opencv_img.html
src =读取Lenna灰度图像
render =260×200 Mat 直方图视图
每个维度的直方图大小hdims = {256}
hist =计算src图像的联合密集直方图。
minVal, maxVal=hist直方图的最小值、最大值
画直方图
显示图像
显示直方图
18.HOGSample
HOG (Histogram-of-Oriented-Gradients)
方向梯度直方图 描述符和目标检测器示例 特征检测
参考:OpenCV HOG SVM行人检测
img=读取彩色Asahiyama图像
hog =HOG描述符
设置hog线性SVM分类器系数
b=检查检测器尺寸
显示b
watch=秒表类实例。
found =使用默认参数运行检测器。为了获得更高的命中率(和更多的假告警),降低hitThreshold和groupThreshold(将groupThreshold设置为0,以完全关闭分组)。
显示用时
显示发现的区域
在img画HOG检测器返回的矩形
全屏显示img
19.HoughLinesSample
霍夫变换示例
imgGray =读取Goryokaku灰度图像
imgStd =读取Goryokaku彩色图像
imgProb = imgStd
imgGray =imgGray检测到的角点
使用标准霍夫变换在二值图像中寻找线。(图像,可以被函数修改;ρ:累加器的像素距离分辨率;θ:累加器的角度分辨率(以弧度为单位);阈值;)
segStd =返回直线的输出向量。每条线都由一个二元向量(,)表示。为到坐标原点(0,0)(图像左上角)的距离,为以弧度为单位的直线旋转角
limit=10,或segStd长度如长度<10
在imgStd上画变换线
segProb =运行概率Hough变换
在imgProb上画变换线
显示imgStd、imgProb
20.InpaintSample
修复图像示例
参考:http://opencv.jp/sample/special_transforms.html#inpaint
热键:
ESC -退出程序
r -恢复原始图像
i或回车-运行修复算法(运行之前,在图像上画些东西)
s -保存原始图像,蒙版图像,原始 蒙版图像和inpainted图像到桌面。
img0=读取Fruits图像
img=img0
inpaintMask=黑色img0大小图像
inpainted=与img0图像具有相同大小、深度和通道的空图像
wImage =显示img图像的窗口
wImage鼠标回调函数:
在inpaintMask和img上,用鼠标画线
监听键盘操作:
ESC:退出
r:inpaintMask涂黑,img0拷贝到img,显示img
i 或 \r:
用Alexandru Telea算法修复图像,显示修复结果
用Navier-Strokes算法修复图像,显示修复结果
s:保存img0、inpaintMask、img、inpainted到桌面
21.KAZESample
检索关键点使用KAZE和AKAZE算法示例
gray =读取灰度Lenna图像
kaze =KAZE算法实例
akaze =AKAZE算法实例
kazeKeyPoints, kazeDescriptors=用KAZE算法检测关键点,计算描述符
kazeTime =KAZE算法用时
akazeKeyPoints, akazeDescriptors=用AKAZE算法检测关键点,计算描述符
akazeTime =AKAZE算法用时
dstKaze =在gray上绘制kazeKeyPoints的图像
dstAKaze =在gray上绘制akazeKeyPoints的图像
显示dstKaze、dstAKaze
22.KAZESample2
检索关键点使用KAZE算法示例2
参考:https://github.com/shimat/opencvsharp/issues/176
img1 =读取box.png图像
img2 =读取box_in_scene.png图像
matcher =特征匹配BFMatcher类实例
kaze =KAZE算法实例
keypoints1, descriptors1=用KAZE算法检测img1图像的关键点,计算的描述符
keypoints2, descriptors2=用KAZE算法检测img2图像的关键点,计算的描述符
matches =用matcher匹配的descriptors1和descriptors2的特征
mask =matches.Length×1 Mat 用Scalar(255)填充
nonZero =计算mask数组元素的数目
投票给独特性函数 VoteForUniqueness(matches, mask);
nonZero =计算mask数组元素的数目
nonZero =为大小和方向投票函数 VoteForSizeAndOrientation(keypoints2, keypoints1, matches, mask, 1.5f, 20);
遍历掩码只取出非零项,因为它们是匹配的
obj.Add(keypoints1)
scene.Add(keypoints2)
goodMatchesList.Add(matches)
如果非零项数nonZero>4:
homography =计算将objPts映射到 scenePts的最佳视角转换。输出掩码mask
nonZero =计算mask数组元素的数目
如果homography 不为空:
sceneCorners=对homography矩阵的每个元素进行透视变换
img3 =img1右侧叠加img2
从img1、img2两个图像中提取关键点的匹配绘制到img3。
在img3中的img2上绘制匹配img1的图像外框
保存img3
显示img3
投票给独特性函数 VoteForUniqueness:
新建byte[] maskData长度为匹配特征长度
提供用于从非托管内存访问托管对象的方法。阻止回收托管的对象
m=Mat(int rows, int cols, MatType type, IntPtr data, long step = 0);矩阵头文件的构造函数指向用户分配的数据
(IntPtr data:指向用户数据的指针。接受数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化
指向指定数据的matrix头文件,这意味着不复制任何数据。这个操作非常高效,可以使用OpenCV函数来处理外部数据。
外部数据不会被自动分配,所以你应该处理它。)
如图像1特征距离÷图像2特征距离<=设定阈值 (这也被称为NNDR最近邻距离比)
mask[i]=255,否则=0
释放托管对象管理
为大小和方向投票函数 VoteForSizeAndOrientation:
提供用于从非托管内存访问托管对象的方法。阻止回收托管的对象
m=Mat(int rows, int cols, MatType type, IntPtr data, long step = 0);矩阵头文件的构造函数指向用户分配的数据
(IntPtr data:指向用户数据的指针。接受数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化
指向指定数据的matrix头文件,这意味着不复制任何数据。这个操作非常高效,可以使用OpenCV函数来处理外部数据。
外部数据不会被自动分配,所以你应该处理它。)
取掩码的每行:
如该掩码大于0:
s=(小图特征点大小÷大图对应特征点索引的特征点大小)的对数
s加入到logScale
如果s大于maxS,则maxS=s
如果s小于minS,则minS=s
r=特征点角度差
如r为负值,则 360
r加入到rotations
scaleBinSize(本规模大小)=(maxS与minS差)÷scaleIncrement(传入的规模增加值)的对数
如果scaleBinSize小于2,则scaleBinSize=2
规模范围scaleRanges = { (float)minS, (float)(minS scaleBinSize Math.Log10(scaleIncrement))
scalesMat=logScale Mat
rotationsMat=rotations Mat
arrs = { scalesMat, rotationsMat };
hist=计算arrs图像的联合密集直方图。
maxVal=hist最大值
对hist每个数组元素应用一个maxVal * 0.5的阈值。
flagsMat=arrs图像反向投影。
flagsMat索引=0的对应掩码数值=0,否则nonZeroCount
释放托管对象管理
返回 nonZeroCount
23.MatOperations
Mat操作示例
src =读取Lenna图像
small=src缩写到100×100
src[10, 110, 10, 110]处贴上small
src[370, 470, 400, 500]处贴上small转置
src[200, 400, 200, 360]位置像素取反
src[50, 100, 400, 450]位置像素设置为128
显示src
src =读取Lenna图像
src.RowRange(100, 200)7×7高斯滤波输出到src.RowRange(200, 300)
src.RowRange(200, 300)7×7高斯滤波输出到src.RowRange(100, 200)
显示src
src =读取Lenna图像
100,400行随机选择交换
ColRange(450, 500)取反复制到ColRange(0, 50)
RowRange(450, 460)颜色设置为Scalar(0, 0, 255)
显示src
24.MatToBitmap
ToMat():
bitmap = new Bitmap读取图片Lenna511
converted=bitmap转Mat
显示converted
等待按任意键
ToMatGrayScale():
bitmap = new Bitmap读取灰度图片Lenna511
converted=bitmap转Mat
显示converted
等待按任意键
ToBitmap():
img=读取彩色Lenna511图像
Bitmap bitmap =img转bitmap
用win窗体、PictureBox显示bitmap
等待按回车键和点击关闭,关闭窗体
ToBitmapGrayScale();
img=读取灰度Lenna511图像
Bitmap bitmap =img转bitmap
用win窗体、PictureBox显示bitmap
等待按回车键和点击关闭,关闭窗体
25.MatToWriteableBitmap
System.Windows.Media.Imaging.WriteableBitmap和Mat之间转换的静态类演示
mat =读取彩色Lenna511图像
wb =mat转为WriteableBitmap格式
image.Source = wb
window=窗体实例
image添加到window
app=Application实例
app运行window
26.MDS
多维标度构成法示例(没懂。需再学学)
参考:centering matrix中心矩阵的代码测试
https://blog.csdn.net/qq_36206070/article/details/110505432
CityDistance =美国10个城市之间的距离10×10数组
CityNames =10个美国城市名称
t =CityDistance转换为矩阵
torgarson = Torgerson(t)(相加常数?没懂,值=24)
t = torgarson
t=将t的所有元素平方
g =10×10中心矩阵
b = g * t * g.T() * -0.5(计算内积矩阵)
计算b的特征值和特征向量
特征值<0的,=0
将特征值开方乘以特征向量
展开特征向量
新建图像img
在img上绘制特征向量红点
偏移(5,10),写城市名称
显示img
27.MergeSplitSample
拆分/合并示例
src =读取Lenna彩色图像
拆分各个通道
分别显示每个通道
通道1取反
合并各通道到merged
显示src、merged
rgba =300×300图像,颜色Scalar(50, 100, 150, 200)
bgr, alpha与rgba相同大小
混合通道:
rgba[0] -> bgr[2], rgba[1] -> bgr[1],
rgba[2] -> bgr[0], rgba[3] -> alpha[0]
显示rgba、bgr、alpha
28.MorphologySample
形态学示例
gray =读取Lenna灰度图像
kernel =3×3的 形状核
binary=二值化gray
dilate1=用空核膨胀binary
dilate2=用kernel膨胀binary
显示binary、dilate1、dilate2
29.MSERSample
MSER(最大稳定极值区域)示例
src =读取Distortion彩色图像
gray =src转灰度图像
mser =MSER实例
检测MSER,contours=点集的结果列表,bboxes=结果边框列表
用随机颜色绘制contours的点
显示src、gray、点集的绘制结果
30.NormalArrayOperations
正常的数组操作示例
对字节数组执行阈值:
input = {1, 2, 3, 4, 5, }
output =对每个数组元素应用一个固定级别的阈值。阈值=T=3,阈值类型的最大值=Max=5,阈值类型Binary。
输出T、input、output
对数值数组执行阈值:
input = { 50, 100, 150, 200, 250, }
output =对每个数组元素应用一个固定级别的阈值。阈值=T=150,阈值类型的最大值=Max=250,阈值类型Binary。
输出T、input、output
对结构数组执行阈值:
input = {new Point2f(1000, 1500),new Point2f(2000, 2001),new Point2f(500, 5000), };
output =对每个数组元素应用一个固定级别的阈值。阈值=T=2000,阈值类型的最大值=Max=5000,阈值类型Binary。
输出T、input、output
-----------------
结果:
Threshold: 3
input: 1,2,3,4,5
output: 0,0,0,5,5
Threshold: 150
input: 50,100,150,200,250
output: 0,0,0,250,250
Threshold: 2000
input: (x:1000 y:1500),(x:2000 y:2001),(x:500 y:5000)
output: (x:0 y:0),(x:0 y:5000),(x:0 y:5000)
31.OpenVinoFaceDetection
OpenVino人脸检测示例
frame =读取图像
frameHeight,frameWidth =frame高宽
没有下载到 OpenVino使用的.bin文件,跳过
……
32.PerspectiveTransformSample
视角转换示例
srcPoints =原点
dstPoints=640×480四角的点
OriginalImage =读取box_in_scene.png彩色图像
显示OriginalImage
设置鼠标回调函数CallbackOpenCVAnnotate
按任意键结束
CallbackOpenCVAnnotate函数:
在图像上点击4次,作为变换图像的四角。
从四对对应的点计算透视变换。这个函数计算一个透视变换的3×3矩阵matrix。
对OriginalImage图像应用matrix透视变换。输出到dst
显示dst
(点击顺序左上左下右下右上,图像不旋转)
33.PhotoMethods
Photo模块方法的示例
src = 读取Fruits彩色图像
(EdgePreservingFilter()边缘保持滤波器。滤波是图像和视频处理的基本操作。保持边缘平滑滤波器被用于许多不同的应用。
参数:src:输入 8 位 3 通道图像。
dst: 输出 8 位 3 通道图像。
flags: 边缘保护滤波 EdgePreservingMethods.NormconvFilter //归一化卷积滤波 或 EdgePreservingMethods.RecursFilter //递归滤波。
sigma_s:取值范围为 0~200。
sigma_r:取值范围为 0~1。
当sigma_s 取值不变时候,sigma_r 越大图像滤波效果越明显;
当sigma_r 取值不变时候,窗口 sigma_s 越大图像模糊效果越明显;
当sgma_r取值很小的时候,窗口 sigma_s 取值无论如何变化,图像双边滤波效果都不好!)
normconv=src归一化卷积滤波sigmaS = 60,sigmaR = 0.4F
recursFildered=src递归滤波sigmaS = 60,sigmaR = 0.4F
detailEnhance=使用滤镜增强src特定图像的细节。sigmaS = 10, sigmaR = 0.15F
输出像铅笔一样的非逼真的线条画 pencil1 单通道图像, pencil2 通道与输入一致sigmaS = 60,sigmaR = 0.07F,shadeFactor = 0.02F
stylized=风格化效果 sigmaS = 60, sigmaR = 0.45F
显示各图像
34.PixelAccess
交换B、R通道示例
慢的:Get/Set
mat =读取Lenna彩色图像
取每个像素点,颜色0与颜色2数值交换
输出耗时
相当快的:GenericIndexer
mat =读取Lenna彩色图像
indexer =mat的索引器3元类型。索引器使用getter /setter来访问mat矩阵每个元素。
取每个像素点索引,颜色0与颜色2数值交换
输出耗时
快的:TypeSpecificMat
mat =读取Lenna彩色图像
mat3=3元组mat
indexer =mat3的索引器。索引器使用getter /setter来访问mat3矩阵每个元素。
取每个像素点索引,颜色0与颜色2数值交换
输出耗时
-------------
结果:
Get/Set: 559ms
GenericIndexer: 195ms
TypeSpecificMat: 37ms
35.Pose
未找到pose_iter_160000.caffemodel 跳过
36.seamlessClone
无缝的克隆示例
图像编辑任务既要关注全局变化(颜色/强度校正、滤镜、变形),也要关注与选定内容相关的局部变化。
在这里,我们感兴趣的是以无缝和轻松的方式实现局部更改,这些更改被限制在一个手动选择的区域(ROI)中。
变化的范围从轻微的扭曲到完全被新颖的内容取代@cite PM03。
src=读取Girl彩色图像
dst=读取Lenna彩色图像
src0=src缩放到dst大小
mask =src0大小黑图像
mask 在(200,200)画半径100的白圈
blend1=src0正常克隆到dst(260, 270)位置,掩膜为mask
blend2=src0单色转移克隆到dst(260, 270)位置,掩膜为mask
blend3=src0混合克隆到dst(260, 270)位置,掩膜为mask
显示各图像
37.SiftSurfSample
SIFT 和 SURF 示例
参考:http://www.prism.gatech.edu/~ahuaman3/docs/OpenCV_Docs/tutorials/nonfree_1/nonfree_1.html
src1=读取match1.png彩色图像
src2=读取match2.png彩色图像
SIFT:
gray1=src1转灰度图
gray2=src2转灰度图
sift =SIFT实例
keypoints1, descriptors1=使用SIFT检测gray1关键点并生成它们的描述符
keypoints2, descriptors2=使用SIFT检测gray2关键点并生成它们的描述符
bfMatcher = BFMatcher蛮力描述符匹配器。对于第一个集合中的每个描述符,匹配器通过逐个尝试找到第二个集合中最接近的描述符。
flannMatcher =FlannBasedMatcher蛮力描述符匹配器。
bfMatches=用bfMatcher匹配descriptors1,descriptors2
flannMatches=用flannMatcher匹配descriptors1,descriptors2
bfView=用bfMatches匹配的gray1,gray2匹配结果
flannView=用flannMatches匹配的gray1,gray2匹配结果
显示bfView、flannView
SURF:
gray1=src1转灰度图
gray2=src2转灰度图
surf =SURF实例
只提取keypoint.hessian大于200的特征;探测器使用的高斯金字塔八度音阶数。默认设置为4;
高斯金字塔的每个八度内的图像数量。默认设置为2;true表示扩展描述符(128个元素)
keypoints1, descriptors1=使用surf检测gray1关键点并生成它们的描述符
keypoints2, descriptors2=使用surf检测gray2关键点并生成它们的描述符
bfMatcher = BFMatcher蛮力描述符匹配器。对于第一个集合中的每个描述符,匹配器通过逐个尝试找到第二个集合中最接近的描述符。
flannMatcher =FlannBasedMatcher蛮力描述符匹配器。
bfMatches=用bfMatcher匹配descriptors1,descriptors2
flannMatches=用flannMatcher匹配descriptors1,descriptors2
bfView=用bfMatches匹配的gray1,gray2匹配结果
flannView=用flannMatches匹配的gray1,gray2匹配结果
显示bfView、flannView
(效果都不好!)
38.SimpleBlobDetectorSample
简单的斑点检测器示例
src =读取Shapes图像
反转src的图像。Shapes的背景是黑色的,而SimpleBlobDetector似乎不能很好地与之配合。
设置circleParams参数,并调整参数到只检测圆
设置ovalParams参数,并调整参数到只检测椭圆
circleDetector =用circleParams参数建立的SimpleBlobDetector的实例
用circleDetector检测src图像的特征点
在detectedCircles绘制src图像的特征点
ovalDetector =用circleParams参数建立的SimpleBlobDetector的实例
用ovalDetector检测src图像的特征点
在detectedOvals绘制src图像的特征点
显示detectedCircles、detectedOvals
39.SolveEquation
解方程示例
求解方程AX = Y
av= {{1, 1},{2, 3}}
yv = {10, 26}
a=mat av,y=mat yv
求x
输出x[0],x[1]
a= {{1, 1},{2, 3}}
y = {10, 26}
求x
输出x[0],x[1]
40.StarDetectorSample
使用星检测器算法检索关键点示例
dst =读取Lenna彩色图像
gray =读取Lenna灰度图像
detector =星检测器算法实例maxSize =45
keypoints=用detector检测gray得到的关键点
如keypoints不为空,在dst上画出keypoints。
显示dst
41.Stitching
拼接图像示例
source =读取Lenna彩色图像
随机取10个200×200的位置,画框,图像保存到mats
显示画框结果
stitcher =拼接类Stitcher的实例
拼接mats到pano
显示pano图像
销毁中间结果。
42.Subdiv2DSample
创建随机点列表points
img=600×600黑图
在img上points点位置画红圈
创建一个空的Subdiv2D对象subdiv
创建一个新的空Delaunay细分参数是包含所有要添加到细分中的2D点的矩形
在Delaunay三角剖分中插入多个点points。
返回所有Voronoi facet的列表。
vonoroi = img
在vonoroi上用Voronoi facet的列表绘制多边形
edgeList = subdiv返回所有连线的列表。
delaunay = img
在delaunay上用edgeList画连线
显示vonoroi、delaunay
43.SuperResolutionSample
超分辨率示例
capture=视频输入,宽640,高480
如不能扑捉视频,报错退出。
sr=创建双边TV-L1超分辨率。摄像头为-1
循环:
normalFrame=capture获取的帧
srFrame=sr获取的帧
如 normalFrame 或srFrame 为空,退出循环
显示normalFrame、srFrame
等待100毫秒
-------------------
sr.NextFrame(srFrame)执行失败。
44.SVMSample
支持向量机示例
f(x)=x 50 * Sin(x / 15.0);
训练数据500个
随机在(0,300)范围内生成x,y,存入points
如果y>f(x)则y=1,否则y=2,存入responses
训练数据画圆点,responses=1红色,responses=2黄色
用蓝色画(x)曲线
显示绘制结果
训练:
dataMat=用points创建数据集
resMat =用responses创建结果集
svm = SVM类实例
设置svm参数
用svm训练
用svm预测300x300每个像素,结果为1画红色,2画黄色
显示预测结果
45.VideoWriterSample
OutVideoFile = "out.avi"
capture =打开MP4文件 Bach
dsize = new Size(640, 480);
writer=用于读视频帧并把它们写入的VideoWriter
输出 转换每个电影帧…
循环:
frame=读取视频帧
如为空,则退出循环
输出 第几帧,共几帧
gray=frame转灰度
canny=gray检测的角点
dst=canny缩放到dsize大小
writer写入dst
输出空行
capture2=打开OutVideoFile
播放OutVideoFile
------------------------
[ERROR:0] global D:\a\opencv_files\opencv_files\opencv\modules\videoio\src\cap.cpp (574)
cv::VideoWriter::open VIDEOIO(CV_IMAGES): raised unknown C exception!
46.VideoCaptureSample
capture =打开MP4文件 Bach
每帧延时sleepTime =1000 / capture.Fps
播放文件
47.WatershedSample
分水岭算法示例
srcImg =读取Lenna彩色图像
markers =srcImg大小掩膜
显示srcImg
dspImg=srcImg
seedNum = 0
鼠标回调函数:按下鼠标:
seedNum
pt=鼠标位置
在markers画圆(pt=圆点,半径10,颜色seedNum)
在dspImg画圆(pt=圆点,半径10,颜色白色)
window.Image = dspImg
等待按任意键
使用分水岭算法进行基于标记的图像分割。 InputOutputArray markers
dspImg=srcImg
在dspImg上分水岭位置画2×2红方块
显示dspImg
48.WindowGUISample
Windows_Example();
显示图像
等待按任意键结束
TrackBar_Example();
src =读取图像
src =复制到 dst
结构元件的形状elementShape=方块
最大迭代=10
openCloseWindow显示dst
在显示画面建立Trackbar控件,名称:迭代,初始位置10,max=maxIterations * 2 1
Trackbar拖动:
n = pos - maxIterations//正负10之间变化
//返回用于形态学运算的指定大小和形状的结构元素。函数构造并返回可进一步传递以进行
侵蚀、扩张或扩展的结构元素形态学。
//但是您也可以自己构造一个任意的二进制掩码,并将其用作结构元素。
var element = Cv2.GetStructuringElement(
elementShape, //可以是MorphShapes之一的元素形状
new Size(an * 2 1, an * 2 1),//结构元素的大小。
new Point(an, an));//元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。
//请注意,只有十字形元素的形状取决于锚定位置。在其他情况下,锚定只调节形态学运算结果的偏移量。
MorphologyEx 执行高级形态变换src:源图像; dst:目标图像; 形态学操作的类型;element:结构化元素;anchor:元素中锚点的位置。
n<0:执行开运算,显示文字“开/侵蚀:”elementShape
否则闭运算,显示文字“闭/膨胀:”elementShape
erodeDilateWindow显示dst
在erodeDilateWindow显示画面建立Trackbar控件,名称:迭代,初始位置10,max=maxIterations * 2 1
Trackbar拖动:
n = pos - maxIterations//正负10之间变化
//返回用于形态学运算的指定大小和形状的结构元素。函数构造并返回可进一步传递以进行
侵蚀、扩张或扩展的结构元素形态学。
//但是您也可以自己构造一个任意的二进制掩码,并将其用作结构元素。
var element = Cv2.GetStructuringElement(
elementShape, //可以是MorphShapes之一的元素形状
new Size(an * 2 1, an * 2 1),//结构元素的大小。
new Point(an, an));//元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。
//请注意,只有十字形元素的形状取决于锚定位置。在其他情况下,锚定只调节形态学运算结果的偏移量。
MorphologyEx 执行高级形态变换src:源图像; dst:目标图像; 形态学操作的类型;element:结构化元素;anchor:元素中锚点的位置。
n<0:执行侵蚀,显示文字“侵蚀:”elementShape
否则膨胀,显示文字“膨胀:”elementShape
键盘输入:
case 'e':
elementShape = MorphShapes.Ellipse;
break;
case 'r':
elementShape = MorphShapes.Rect;
break;
case 'c':
elementShape = MorphShapes.Cross;
MouseCallBack_Example();
显示图像
Debug输出鼠标操作
等待按任意键结束