1 画矩形(原图,左上角坐标,右下角坐标,画笔颜色,笔宽,画线类型)
cv2.rectangle(img, ptLeftTop, ptRightBottom, point_color, thickness, lineType)
import cv2
img = cv2.imread('C:\\Users\\Administrator\\Desktop\\3.jpg',0)
# 矩形左上角和右下角的坐标,绘制一个红色的矩形
ptLeftTop = (5, 5) #(左上角x, 左上角y)
ptRightBottom = (470, 233) #(右下角x, 右下角y)
point_color = (255, 0 , 255) # RGB框的颜色,自定
thickness = 1
lineType = 0
cv2.rectangle(img, ptLeftTop, ptRightBottom, point_color, thickness, lineType)
cv2.imwrite("C:\\Users\\Administrator\\Desktop\\new_result.jpg", img) # 将画过矩形框的图片保存
img1 = cv2.imread('C:\\Users\\Administrator\\Desktop\\new_result.jpg',0)
cv2.imshow("new", img1)
cv2.waitKey(0)
2 createTrackbar 创建滚动条
createTrackbar() 这个函数用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
该函数的参数有:createTrackbar(const String& trackbarname, const String& winname, int *value, int count, TrackbarCallback onChange = 0, void *userdata = 0),具体含义为:
trackbarname:跟踪栏名称,创建的轨迹栏的名称。
Winname:窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的窗口名。
value:指向整数变量的可选指针,该变量的值反映滑块的初始位置。
count:表示滑块可以达到的最大位置的值,最小位置始终为0。
onChange:指向每次滑块更改位置时要调用的函数的指针,有默认值0。此函数的原型应为void XXX (int, void *); ,其中第一个参数是轨迹栏位置,第二个参数是用户数据(请参阅下一个参数)。如果回调是NULL指针,则不调用任何回调,而仅更新值。
userdata:传递给回调的用户数据,有默认值0。它可以用于处理轨迹栏事件,而无需使用全局变量。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
对于 getTrackbarPos() 函数,它也需要多个参数:
第一个参数是Tarckbar 名称;
第二个参数是它附加到的窗口名称;
第三个参数是默认值;
第四个参数是最大值;
第五个是执行的回调函数每次跟踪栏值更改。回调函数始终具有默认参数,即轨迹栏位置。
import numpy as np
import cv2 as cv
def nothing(x):
pass
# Create a black image, a window
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# create trackbars for color change
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# create switch for ON/OFF functionality
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
# get current positions of four trackbars
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()
3 numpy.zeros(np.zeros)
zeros(shape, dtype=float, order='C')
np.zeros((5,), dtype=np.int)
array([0, 0, 0, 0, 0])
import cv2 as cv
import numpy as np
imgi = np.zeros((450, 500), np.uint8)
cv.namedWindow("tj")
cv.imshow("tj", imgi)
cv.waitKey(0)
cv.destroyAllWindows()
4 getStructuringElement
函数会返回指定形状和尺寸的结构元素。
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
5 cvtColor
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) 转灰度图
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
6 cv.inRange
hsv = cv.cvtColor(src_frame, cv.COLOR_BGR2HSV)
# 设置关注颜色的HSV,范围为0-360,s取值为0-1,v取值为0-255
LH = cv.getTrackbarPos("LH", 'tj')
LS = cv.getTrackbarPos("LS", 'tj')
LV = cv.getTrackbarPos("LV", 'tj')
HH = cv.getTrackbarPos("HH", 'tj')
HS = cv.getTrackbarPos("HS", 'tj')
HV = cv.getTrackbarPos("HV", 'tj')
lower_red = np.array([LH, LS, LV])
upper_red = np.array([HH, HS, HV])
# inRange()方法返回的矩阵只包含0,255,(CV_8U) 0 表示不在区间内
mask = cv.inRange(hsv, lower_red, upper_red)
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
注意:该函数输出的dst是一幅二值化之后的图像。
使用示例1:针对单通道图像
dst(I) = lowerb(I)0 ≤ src(I)0 < upperb(I)0
即,如果一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像。
使用示例2:针对三通道图像
dst(I) = lowerb(I)0 ≤ src(I)0 < upperb(I)0 ∧ lowerb(I)1 ≤ src(I)1 < upperb(I)1 ∧lowerb(I)2 ≤ src(I)2 < upperb(I)2
即,每个通道的像素值都在规定的阈值范围内,则为255,否则为0
7 cv.bitwise_and 按位与
dst = cv.bitwise_and(src1,src2[,mask])
src1
与 src2
都是输入值,mask
是掩膜,任何数值与 0 进行按位与操作,都会得到 0,任何数值与 255 进行按位与操作,都会得到数值本身,上述数值都是 8 位无符号数字。
import cv2 as cv
import numpy as np
gray_src = np.random.randint(0, 255, (7, 7), dtype=np.uint8)
black_src = np.zeros((7, 7), dtype=np.uint8)
black_src[3:7, 3:7] = 255
dst = cv.bitwise_and(gray_src, black_src)
print("gray_src")
print(gray_src)
print("black_src")
print(black_src)
print("dst")
print(dst)
FR:徐海涛(hunk Xu)