目录
10.3 旋转 cv2.getRotationMatrix2D()
16.2 视频参数获取--VideoCapture.get() 与设置--VideoCapture.set()
16.3 判断摄像头是否开启 -- VideoCapture.isOpened()
16.4 关闭文件/摄像头(释放)--VideoCapture.release()
16.5 读取该文件/摄像头的下一帧 -- VideoCapture.read()
17.2 write函数--cv2.VideoWriter.write()
19.1 直方图 -- hist = cv2.calcHist( )
关键函数:
cv.imread()
参数:
要读取的图像
读取方式的标志
cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
cv.IMREAD*GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。
(可以使用1、0或者-1来替代上面三个标志)
import cv2 as cv #以灰度图的形式读取图像
img = cv.imread('genggui.jpg',0)
cv.imshow()
参数:
注意:在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
cv.imshow('image',img) #opencv中显示
cv.waitKey(0) #等待窗口
运行结果:

cv.imwrite()
参数:
cv.imwrite('genggui.png',img)
案例:
import cv2 as cv
img = cv.imread('genggui.jpg',0) #以灰度图的形式读取图像
cv.imshow('image',img) # opencv中显示
cv.waitKey(0)
cv.imwrite('gengguigray.png',img) #保存所生成的灰度图像
创建窗口
cv2.namedWindow(窗口名称, 属性) #创建一个窗口
关闭图像窗口
1.关闭一个由imshow产生的图像窗口
cv2.destroyWindow()
参数:winname,关闭的窗口名字
2.关闭所有由imshow产生的窗口
cv2.destroyAllWindows()
关键函数:
cv.line(img,start,end,color,thickness)
参数:
cv.circle(img,centerpoint, r, color, thickness)
参数:
cv.rectangle(img,leftupper,rightdown,color,thickness)
参数:
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
参数:
cv2.flip(img,flipcode) #flipcode控制翻转效果
imgcopy = img.copy()
图像属性包括高、宽和通道数,像素数,图像数据类型等。
img.shape #打印图片的高、宽和通道数
img.size #打印图片的像素数目(图片大小)
img.dtype #打印图片的格式(数据类型)
我们可以通过行和列的坐标值获取该像素点的像素值。对于BGR图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素值进行修改。
import cv2 as cv
img = cv.imread('genggui.jpg')
px = img[100,100] #获取某个像素点的值
blue = img[100,100,0] #仅获取蓝色通道的强度值
img[100,100] = [255,255,255] #修改某个位置的像素值
有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。
cv2.split(img)
cv2.merge(img)
OpenCV中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR↔Gray和BGR↔HSV。
cv.cvtColor(input_image,flag)
参数:
更全的参数:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #BGR转换到GRAY
cv2.imshow("gray", gray)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #BGR转换到HSV
cv2.imshow("hsv", hsv)
关键函数:
cv2.add(src1, src2) #参数为图片1与图片2
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:
g(x) = (1−α)f0(x) + αf1(x)
通过修改 α 的值(0 → 1),可以实现非常炫酷的混合,落到函数中为两个权重。
cv2.addWeighted(src1, alpha, src2, beta,gamma,dst)
参数:
例子:第一幅图像的权重是0.7,第二幅图像的权重是0.3,使用cv2.addWeighted()函数进行混合
img1=cv2.imread('1.jpg')
img2=cv2.imread('2.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
(加)
cv2.add(src1, src2) #加
(减)
cv2.subtract(src1, src2) #减
(乘)
cv2.multiply(src1, src2) #乘
(除)
cv2.divide(src1, src2)
均值
cv2.mean(img) #均值
均值和方差
M1, dev1 = cv2.meanStdDev(img) #均值和方差
与运算
dst = cv2.bitwise_and(src1, src2) #与
cv2.imshow("bitwise_and", dst)
或运算
dst = cv2.bitwise_or(src1, src2) #或
cv2.imshow("bitwise_or", dst)
非运算(非运算就是对图像进行颜色反转)
dst = cv2.bitwise_not(src1, src2) # 非(其实是颜色翻转)
cv2.imshow("bitwise_not", dst)
异或运算
cv2.imshow(“bitwise_not”, dst)
dst = cv2.bitwise_xor(src1, src2)
cv2.resize(InputArray src, OutputArray dst, Size dsize,
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数:
插值方法:(默认的插值方法为:双线性插值)

cv2.warpAffine(src,M,dsize)
参数:
cv2.getRotationMatrix2D(center, angle, scale)
参数:
返回:M:旋转矩阵
1.腐蚀
#腐蚀
dst = cv2.erode( src, kernel, anchor, iterations, borderType, borderValue )
参数:
dst:腐蚀后所输出图像,该图像和原始图像具有同样的类型和大小。
src:输入图像,图像的通道数可以是任意的。但是要求图像的类型必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
kernel:腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
kernel = cv.getStructuringElement(cv.MORPH_RECT,(5, 5)) #矩形结构
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5, 5)) #椭圆结构
kernel = cv.getStructuringElement(cv.MORPH_CROSS,(5, 5)) # 十字形结构
anchor代表element结构中锚点的位置。该值默认为(-1, -1),在核的中心位置。
terations是腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。
borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。
2.膨胀
#膨胀
dst = cv2.dilate( src, kernel, anchor, iterations, borderType, borderValue)
参数:kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应参数的含义一致。
先腐蚀再膨胀的操作称为开运算。先膨胀再腐蚀的操作称为闭运算。
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开操作
cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) #闭操作
1.图像减去开运算结果称为顶帽变换(Top-hat)。
cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #顶帽运算
2.图像减去闭运算结果称为底帽变换(Bottom-hat)。
cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) #底帽运算
3.膨胀结果减去腐蚀结果,可以得到图像中物体的边界,是一种提取目标物体边缘的算法。
cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #形态学梯度
cv2.boxFilter( src, dst,ddepth, ksize, Point anchor = Point(-1,-1),
bool normalize = true,borderType = BORDER_DEFAULT )
参数:
src:输入图像
dst:输出图像
ddepth:输出图像的深度,-1 代表使用原图深度
ksize: 滤波内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(10, 10)就表示 10x10 的核大小
anchor = Point(-1,-1) :表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
normalize = true:默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了
borderType = BORDER_DEFAULT:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
cv2.blur(src, dst, ksize, Point anchor = Point(-1,-1),borderType = BORDER_DEFAULT)
src:输入图像 。
dst:输出图像 。
ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。
anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。
boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT
cv2.GaussianBlur( src, dst, ksize,sigmaX, sigmaY = 0, borderType = BORDER_DEFAULT )
src:输入图像 。
dst:输出图像 。
ksize:ksize.width 和 ksize.height 可以不同,但他们都必须为正数和奇数,或者为0,可由 sigma 计算而来
sigmaX:高斯核函数在 X 方向的的标准差
sigmaY:高斯核函数在 Y 方向的的标准差
若 sigmaY 为零,就将它设为 sigmaX;若 sigmaX 和 sigmaY 都是0,那么就由 ksize.width 和 ksize.height 计算出来.
medianBlur(InputArray src,OutputArray dst,int ksize)
src:输入图像 。
dst:输出图像 。
ksize:孔径的线性尺寸,这个参数必须是大于1 的奇数
bilateralFilter(src, dst, d, double sigmaColor,double sigmaSpace,
borderType=BORDER_DEFAULT)
src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
dst: 输出图像,和原图像有相同的尺寸和类型。
d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
展示图像:
cv2.findContours(img,mode, method) # 找出图中的轮廓值,得到的轮廓值都是嵌套格式的
参数:
RETR_EXTERNAL:只检索最外面的轮廓。
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中。
RETR_CCOMP:检索所有的轮廓,并肩他们组织为两层:顶层为各部分外部边界,第二层是空洞的边界。
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
CHAIN_APPROX_NONE : 以Freeman链码的方式输出轮廓,所有其它方法输出多边形。
CHAIN_APPROX_SIMPLE : 压缩水平的、垂直的和斜着的部分,也就是函数只保留他们终点部分。
cv2.drawCountours(img, contours, -1, (0, 0, 255), 2) # 画出图片中的轮廓值,也可以用来画轮廓的近似值
参数:
第一步:载入图片
第二步:使用cv2.cvtcolor() 将图片转换为灰度图
第三步: 使用cv2.threshold将图片做二值化转换
第四步: 使用cv2.findContours 找出图片的轮廓值
第五步:使用cv2.drawContours在图片上画上轮廓
第六步: 使用cv2.imshow 完成画图操作
cv2.contourArea(cnt, True) # 计算轮廓的面积
参数说明:cnt为输入的单个轮廓值
cv2.arcLength(cnt, True) # 计算轮廓的周长
参数说明:cnt为输入的单个轮廓值
使用cv2.findCountor获得的轮廓contours是一个嵌套的类型,即我们可以通过cnt = contours获得第一个物体的轮廓值
第一步:载入图片,做灰度值和二值化处理,并使用cv2.findCountor找出轮廓值,使用cv2.drawCountors画出第一个图像的轮廓
第二步:通过索引取出第一个轮廓值cnt,使用cv2.ContourArea()计算轮廓的面积
第三步:使用cv2.arcLength 获得轮廓的周长
使用cv2.boudingrect(cnt)获得轮廓的外接矩形,接着使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓。
1.获得外接矩形位置信息:
x, y, w, h = cv2.boudingrect(cnt) # 获得外接矩形
参数说明:x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,以及矩形的宽和高, cnt表示输入的轮廓值。
2.根据坐标在图像上画出矩阵的轮廓
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 根据坐标在图像上画出矩形
参数说明: img表示传入的图片, (x, y)表示左上角的位置, (x+w, y+h)表示加上右下角的位置,(0, 255, 0)表示颜色,2表示线条的粗细
1.获得外接圆的位置信息
(x, y), radius = cv2.minEnclosingCircle(cnt) # 获得外接圆的位置信息
参数说明: (x, y)表示外接圆的圆心,radius表示外接圆的半径, cnt表示输入的轮廓
2. 根据坐标在图上画出圆
cv2.Cricle(img, center, radius, (0, 255, 0), 2) # 根据坐标在图上画出圆
参数说明:img表示需要画的图片,center表示圆的中心点,radius表示圆的半径, (0, 255, 0)表示颜色, 2表示线条的粗细
外接矩形: 使用cv2.boudingrect(cnt)获得轮廓的外接矩形,使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓
外接圆: 使用cv2.minEnclosingCircle(cnt)获得轮廓的外接圆,使用cv2.circle(ret, centers, radius, (0, 0, 255), 2)画出圆的轮廓
第一步:载入图片,灰度化,二值化,使用cv2.findCountors找出图像的轮廓,使用轮廓索引获得第一个轮廓cnt
第二步:使用cv2.boundingrect(cnt) ,获得轮廓的x,y,w, h (x, y)表示左上角的坐标,w为宽,h为长
第三步: 使用cv2.rectangle 绘制外接的轮廓
第四步: 使用cv2.minEnclosingCircle(cnt), 获得center和radius,即圆心点的坐标和圆的半径
第五步: 使用cv2.circle(img, center, radius, (0, 0, 255), 2) 绘制圆心的外接轮廓
1. 下采样:图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)
cv.pyrUP(img) #对图像进行上采样
2. 上采样图像扩大(先扩大,再卷积或者使用拉普拉斯金字塔)
cv.pyrDown(img)#对图像进行下采样
cv2.copyMakeBorder(img,top, bottom, left, right ,borderType)
参数:
img:需要填充的图像;top:图像上边界需要填充的像素点;bottom:图像下边界需要填充的像素点;left:图像左边界需要填充的像素点;right:图像右边界需要填充的像素点;borderType:图像填充的方法。填充方法:
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法 abcdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充,需要在设置一个value值,已显示填充的颜色。
(可以从视频文件、图像序列和摄像头捕获视频。 OpenCV提供了cv2.VideoCapture类来处理视频。VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件,又能处理摄像头信息。)
cv2.VideoCapture (const String &filename, int apiPreference=CAP_ANY)
参数: (一般仅填入一个,即文件名。如果填入整数,则打开对应的捕获设备ID。若为0,则打开默认摄像头。)
filename : 打开的视频文件名。
const String 包括: 视频名 (eg: video.avi)
图像序列 (eg: img_%02d.jpg)
URL视频流 (eg: protocol://host:port/script_name?script_params|auth)
apiPreference : 当多种capture方式都可以使用时,指定一种方式(CAP_FFMPEG or CAP_IMAGES )
例子: cv2.VideoCapture capture("C:/Users/DADA/DATA/gogo.avi"); // 从视频文件读取
cv2.VideoCapture.get()
先读取视频文件:(然后后面可以直接写 video.get() or video.set() )
import cv2
# 读取视频文件
video = cv2.VideoCapture('./genggui.mp4')
1.获取视频参数:
# 获取视频参数
param = video.get(CV_CAP_PROP_FRAME_COUNT) # 也可使用以下数字表示参数
'''
cv2.VideoCapture.get(0) CV_CAP_PROP_POS_MSEC 视频文件的当前位置,以毫秒为单位
cv2.VideoCapture.get(1) CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4) CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
cv2.VideoCapture.get(5) CV_CAP_PROP_FPS 帧速率
cv2.VideoCapture.get(6) CV_CAP_PROP_FOURCC 编解码器/fourcc
cv2.VideoCapture.get(7) CV_CAP_PROP_FRAME_COUNT 帧数
cv2.VideoCapture.get(8) CV_CAP_PROP_FORMAT 返回对象的格式
cv2.VideoCapture.get(9) CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10) CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11) CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12) CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13) CV_CAP_PROP_HUE 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14) CV_CAP_PROP_GAIN 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15) CV_CAP_PROP_EXPOSURE 曝光(仅适用于照相机)
cv2.VideoCapture.get(16) CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17) CV_CAP_PROP_WHITE_BALANCE 白平衡,暂时不支持
cv2.VideoCapture.get(18) CV_CAP_PROP_RECTIFICATION 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
'''
2.设置视频参数:
# 设置视频参数
video.set(CV_CAP_PROP_FPS, 30) # 第一个参数为设置的参数名,第二个参数为设定的值
'''
可设置的参数与上述可获取的参数大体一致
'''
# 释放
video.release()
参数与上面大体一致:

1.先读取视频
import cv2
# 读取视频文件
video = cv2.VideoCapture('./test.mp4') # 参数为视频文件地址,若是数字表示摄像头编号。
'''
参数为字符串,表示输入的视频文件的地址及文件名
参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
'''
2.判断摄像头是否开启
# 判断视频是否是打开状态
video.isOpened():
参数:无
作用:判断设备/文件是否读取成功,若成功,返回True
cv2.VideoCapture.release()
参数:无
作用:关闭文件/摄像头
如果正确读取了帧,它将为 True 。因此,你可以通过检 查此返回值来检查视频的结尾。
cv2.VideoCapture.read()
参数:无
返回值:bool,numpy.array
作用:读取该文件/摄像头的下一帧,成功与否由bool返回值决定,返回的帧矩阵为第二个参数
OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的完整定义如下:
cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor])
参数:
filename:需要输出保存的视频文件名。如果文件名存在,覆盖原文件。
fourcc:视频的编码类型。在OpenCV中,cv2.VideoWriter_fourcc()函数用来指定视频的编码格式。该函数的参数有4个,这4个字符构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。常用标记如下图:
fps:帧速率,比如录制视频每秒30帧,或者60帧等。
frameSize:帧的长宽
isColor:是否为彩色图像
cv2.VideoWriter类中还提供了cv2.VideoWriter.write()函数用于写入下一帧视频。其完整定义如下:
cv2.VideoWriter.write(image)
image参数是需要写入的视频帧
import cv2
# 读取视频文件
video = cv2.VideoCapture('./test.mp4') # 参数为视频文件地址,若是数字表示摄像头编号。
'''
参数为字符串,表示输入的视频文件的地址及文件名
参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
'''
# 创建写视频器
video_writer = cv2.VideoWriter(filename='./output.mp4', # 保存路径文件名
apiPreference=cv2.CAP_FFMPEG, # 后端
fourcc=cv2.VideoWriter_fourcc(*'mp4v'), # 视频编解码器
fps=25, # 视频帧率
frameSize=(1920,1080) # 视频帧尺寸(W, H)
isColor=True # 彩色图像或黑白图像
)
'''
apiPreference:cv2.CAP_FFMPEG 或者 cv2.CAP_GSTREAMER,此参数是3.x版本的opencv才有的
fourcc:cv2.VideoWriter_fourcc('M', 'P', '4', 'V') 或 fourcc=cv2.VideoWriter_fourcc(*'mp4v')
支持类型:MP4V / X264 / I420 / PIMI / XVID / THEO / FLV1
'''
# 判断视频是否是打开状态
while video.isOpened():
# 读取一帧
ret, frame = video.read() # ret是bool类型,表示是否读取成功;frame为获取的帧图像
if ret:
# 写入一帧
video_writer.write(frame)
# 播放视频
cv2.imshow('frame', frame)
cv2.waitKey(1) # 通过设置等待时间改变播放速度
else:
break
# 释放
video.release()
video_writer.release() # 不释放会无法完成写视频,类似文件写完后的close()
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
(统计出来的像素点的值之间的差距比较大,我们需要缩小像各个像素点之间的值得差距,这就叫均衡化。)
dst = cv2.equalizeHist( src )
参数:src 是 8 位单通道原始图像,dst 是直方图均衡化处理的结果。
result=cv2.matchTemplate( img,template,method)
参数:
1.平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
2.相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
3.利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。
霍夫变换常用来提取图像中的直线和圆等几何图形,霍夫空间中的一条线对应笛卡尔坐标系中一个点,笛卡尔坐标系中两个点,对应霍夫空间一条直线。
cv2.HoughLines(img,rho,theta,threshold)
参数:
OpenCV采用霍夫梯度法将霍夫圆检测范围两个阶段,第一阶段检测圆心,第二阶段利用圆心推导出圆圆心检测的原理:圆心是圆周法线的交汇处,设置-一个阈值,在某点的相交的直线的条数大于这个阈值就认为该交汇点为圆心。
圆半径确定原理:圆心到圆周上的距离(半径)是相同的,确定- 个阈值,只要相同距离的数量大
于该阈值,就认为该距离是该圆心的半径。
circles=cv.HoughCircles(image,method,dp,minDist,param1=100,param2=100,minRadius=0,maxRadius=0)
参数:
这篇课程的学习和总结到这里就结束啦,如果有什么问题可以在评论区留言呀~
如果帮助到大家,可以一键三连+关注支持下~
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来