feat: 切换后端至PaddleOCR-NCNN,切换工程为CMake
1.项目后端整体迁移至PaddleOCR-NCNN算法,已通过基本的兼容性测试 2.工程改为使用CMake组织,后续为了更好地兼容第三方库,不再提供QMake工程 3.重整权利声明文件,重整代码工程,确保最小化侵权风险 Log: 切换后端至PaddleOCR-NCNN,切换工程为CMake Change-Id: I4d5d2c5d37505a4a24b389b1a4c5d12f17bfa38c
This commit is contained in:
@ -0,0 +1,115 @@
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
|
||||
W = 400
|
||||
## [my_ellipse]
|
||||
def my_ellipse(img, angle):
|
||||
thickness = 2
|
||||
line_type = 8
|
||||
|
||||
cv.ellipse(img,
|
||||
(W // 2, W // 2),
|
||||
(W // 4, W // 16),
|
||||
angle,
|
||||
0,
|
||||
360,
|
||||
(255, 0, 0),
|
||||
thickness,
|
||||
line_type)
|
||||
## [my_ellipse]
|
||||
## [my_filled_circle]
|
||||
def my_filled_circle(img, center):
|
||||
thickness = -1
|
||||
line_type = 8
|
||||
|
||||
cv.circle(img,
|
||||
center,
|
||||
W // 32,
|
||||
(0, 0, 255),
|
||||
thickness,
|
||||
line_type)
|
||||
## [my_filled_circle]
|
||||
## [my_polygon]
|
||||
def my_polygon(img):
|
||||
line_type = 8
|
||||
|
||||
# Create some points
|
||||
ppt = np.array([[W / 4, 7 * W / 8], [3 * W / 4, 7 * W / 8],
|
||||
[3 * W / 4, 13 * W / 16], [11 * W / 16, 13 * W / 16],
|
||||
[19 * W / 32, 3 * W / 8], [3 * W / 4, 3 * W / 8],
|
||||
[3 * W / 4, W / 8], [26 * W / 40, W / 8],
|
||||
[26 * W / 40, W / 4], [22 * W / 40, W / 4],
|
||||
[22 * W / 40, W / 8], [18 * W / 40, W / 8],
|
||||
[18 * W / 40, W / 4], [14 * W / 40, W / 4],
|
||||
[14 * W / 40, W / 8], [W / 4, W / 8],
|
||||
[W / 4, 3 * W / 8], [13 * W / 32, 3 * W / 8],
|
||||
[5 * W / 16, 13 * W / 16], [W / 4, 13 * W / 16]], np.int32)
|
||||
ppt = ppt.reshape((-1, 1, 2))
|
||||
cv.fillPoly(img, [ppt], (255, 255, 255), line_type)
|
||||
# Only drawind the lines would be:
|
||||
# cv.polylines(img, [ppt], True, (255, 0, 255), line_type)
|
||||
## [my_polygon]
|
||||
## [my_line]
|
||||
def my_line(img, start, end):
|
||||
thickness = 2
|
||||
line_type = 8
|
||||
|
||||
cv.line(img,
|
||||
start,
|
||||
end,
|
||||
(0, 0, 0),
|
||||
thickness,
|
||||
line_type)
|
||||
## [my_line]
|
||||
## [create_images]
|
||||
# Windows names
|
||||
atom_window = "Drawing 1: Atom"
|
||||
rook_window = "Drawing 2: Rook"
|
||||
|
||||
# Create black empty images
|
||||
size = W, W, 3
|
||||
atom_image = np.zeros(size, dtype=np.uint8)
|
||||
rook_image = np.zeros(size, dtype=np.uint8)
|
||||
## [create_images]
|
||||
## [draw_atom]
|
||||
# 1. Draw a simple atom:
|
||||
# -----------------------
|
||||
|
||||
# 1.a. Creating ellipses
|
||||
my_ellipse(atom_image, 90)
|
||||
my_ellipse(atom_image, 0)
|
||||
my_ellipse(atom_image, 45)
|
||||
my_ellipse(atom_image, -45)
|
||||
|
||||
# 1.b. Creating circles
|
||||
my_filled_circle(atom_image, (W // 2, W // 2))
|
||||
## [draw_atom]
|
||||
## [draw_rook]
|
||||
|
||||
# 2. Draw a rook
|
||||
# ------------------
|
||||
# 2.a. Create a convex polygon
|
||||
my_polygon(rook_image)
|
||||
## [rectangle]
|
||||
# 2.b. Creating rectangles
|
||||
cv.rectangle(rook_image,
|
||||
(0, 7 * W // 8),
|
||||
(W, W),
|
||||
(0, 255, 255),
|
||||
-1,
|
||||
8)
|
||||
## [rectangle]
|
||||
|
||||
# 2.c. Create a few lines
|
||||
my_line(rook_image, (0, 15 * W // 16), (W, 15 * W // 16))
|
||||
my_line(rook_image, (W // 4, 7 * W // 8), (W // 4, W))
|
||||
my_line(rook_image, (W // 2, 7 * W // 8), (W // 2, W))
|
||||
my_line(rook_image, (3 * W // 4, 7 * W // 8), (3 * W // 4, W))
|
||||
## [draw_rook]
|
||||
cv.imshow(atom_window, atom_image)
|
||||
cv.moveWindow(atom_window, 0, 200)
|
||||
cv.imshow(rook_window, rook_image)
|
||||
cv.moveWindow(rook_window, W, 200)
|
||||
|
||||
cv.waitKey(0)
|
||||
cv.destroyAllWindows()
|
38
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py
vendored
Normal file
38
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/HitMiss/hit_miss.py
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
|
||||
input_image = np.array((
|
||||
[0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 255, 255, 255, 0, 0, 0, 255],
|
||||
[0, 255, 255, 255, 0, 0, 0, 0],
|
||||
[0, 255, 255, 255, 0, 255, 0, 0],
|
||||
[0, 0, 255, 0, 0, 0, 0, 0],
|
||||
[0, 0, 255, 0, 0, 255, 255, 0],
|
||||
[0,255, 0, 255, 0, 0, 255, 0],
|
||||
[0, 255, 255, 255, 0, 0, 0, 0]), dtype="uint8")
|
||||
|
||||
kernel = np.array((
|
||||
[0, 1, 0],
|
||||
[1, -1, 1],
|
||||
[0, 1, 0]), dtype="int")
|
||||
|
||||
output_image = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel)
|
||||
|
||||
rate = 50
|
||||
kernel = (kernel + 1) * 127
|
||||
kernel = np.uint8(kernel)
|
||||
|
||||
kernel = cv.resize(kernel, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
|
||||
cv.imshow("kernel", kernel)
|
||||
cv.moveWindow("kernel", 0, 0)
|
||||
|
||||
input_image = cv.resize(input_image, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
|
||||
cv.imshow("Original", input_image)
|
||||
cv.moveWindow("Original", 0, 200)
|
||||
|
||||
output_image = cv.resize(output_image, None , fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
|
||||
cv.imshow("Hit or Miss", output_image)
|
||||
cv.moveWindow("Hit or Miss", 500, 200)
|
||||
|
||||
cv.waitKey(0)
|
||||
cv.destroyAllWindows()
|
51
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py
vendored
Normal file
51
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/Pyramids/pyramids.py
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
import sys
|
||||
import cv2 as cv
|
||||
|
||||
|
||||
def main(argv):
|
||||
print("""
|
||||
Zoom In-Out demo
|
||||
------------------
|
||||
* [i] -> Zoom [i]n
|
||||
* [o] -> Zoom [o]ut
|
||||
* [ESC] -> Close program
|
||||
""")
|
||||
## [load]
|
||||
filename = argv[0] if len(argv) > 0 else 'chicky_512.png'
|
||||
|
||||
# Load the image
|
||||
src = cv.imread(cv.samples.findFile(filename))
|
||||
|
||||
# Check if image is loaded fine
|
||||
if src is None:
|
||||
print ('Error opening image!')
|
||||
print ('Usage: pyramids.py [image_name -- default ../data/chicky_512.png] \n')
|
||||
return -1
|
||||
## [load]
|
||||
## [loop]
|
||||
while 1:
|
||||
rows, cols, _channels = map(int, src.shape)
|
||||
## [show_image]
|
||||
cv.imshow('Pyramids Demo', src)
|
||||
## [show_image]
|
||||
k = cv.waitKey(0)
|
||||
|
||||
if k == 27:
|
||||
break
|
||||
## [pyrup]
|
||||
elif chr(k) == 'i':
|
||||
src = cv.pyrUp(src, dstsize=(2 * cols, 2 * rows))
|
||||
print ('** Zoom In: Image x 2')
|
||||
## [pyrup]
|
||||
## [pyrdown]
|
||||
elif chr(k) == 'o':
|
||||
src = cv.pyrDown(src, dstsize=(cols // 2, rows // 2))
|
||||
print ('** Zoom Out: Image / 2')
|
||||
## [pyrdown]
|
||||
## [loop]
|
||||
|
||||
cv.destroyAllWindows()
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
107
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py
vendored
Normal file
107
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/Smoothing/smoothing.py
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
import sys
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
|
||||
# Global Variables
|
||||
|
||||
DELAY_CAPTION = 1500
|
||||
DELAY_BLUR = 100
|
||||
MAX_KERNEL_LENGTH = 31
|
||||
|
||||
src = None
|
||||
dst = None
|
||||
window_name = 'Smoothing Demo'
|
||||
|
||||
|
||||
def main(argv):
|
||||
cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
|
||||
|
||||
# Load the source image
|
||||
imageName = argv[0] if len(argv) > 0 else 'lena.jpg'
|
||||
|
||||
global src
|
||||
src = cv.imread(cv.samples.findFile(imageName))
|
||||
if src is None:
|
||||
print ('Error opening image')
|
||||
print ('Usage: smoothing.py [image_name -- default ../data/lena.jpg] \n')
|
||||
return -1
|
||||
|
||||
if display_caption('Original Image') != 0:
|
||||
return 0
|
||||
|
||||
global dst
|
||||
dst = np.copy(src)
|
||||
if display_dst(DELAY_CAPTION) != 0:
|
||||
return 0
|
||||
|
||||
# Applying Homogeneous blur
|
||||
if display_caption('Homogeneous Blur') != 0:
|
||||
return 0
|
||||
|
||||
## [blur]
|
||||
for i in range(1, MAX_KERNEL_LENGTH, 2):
|
||||
dst = cv.blur(src, (i, i))
|
||||
if display_dst(DELAY_BLUR) != 0:
|
||||
return 0
|
||||
## [blur]
|
||||
|
||||
# Applying Gaussian blur
|
||||
if display_caption('Gaussian Blur') != 0:
|
||||
return 0
|
||||
|
||||
## [gaussianblur]
|
||||
for i in range(1, MAX_KERNEL_LENGTH, 2):
|
||||
dst = cv.GaussianBlur(src, (i, i), 0)
|
||||
if display_dst(DELAY_BLUR) != 0:
|
||||
return 0
|
||||
## [gaussianblur]
|
||||
|
||||
# Applying Median blur
|
||||
if display_caption('Median Blur') != 0:
|
||||
return 0
|
||||
|
||||
## [medianblur]
|
||||
for i in range(1, MAX_KERNEL_LENGTH, 2):
|
||||
dst = cv.medianBlur(src, i)
|
||||
if display_dst(DELAY_BLUR) != 0:
|
||||
return 0
|
||||
## [medianblur]
|
||||
|
||||
# Applying Bilateral Filter
|
||||
if display_caption('Bilateral Blur') != 0:
|
||||
return 0
|
||||
|
||||
## [bilateralfilter]
|
||||
# Remember, bilateral is a bit slow, so as value go higher, it takes long time
|
||||
for i in range(1, MAX_KERNEL_LENGTH, 2):
|
||||
dst = cv.bilateralFilter(src, i, i * 2, i / 2)
|
||||
if display_dst(DELAY_BLUR) != 0:
|
||||
return 0
|
||||
## [bilateralfilter]
|
||||
|
||||
# Done
|
||||
display_caption('Done!')
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def display_caption(caption):
|
||||
global dst
|
||||
dst = np.zeros(src.shape, src.dtype)
|
||||
rows, cols, _ch = src.shape
|
||||
cv.putText(dst, caption,
|
||||
(int(cols / 4), int(rows / 2)),
|
||||
cv.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255))
|
||||
|
||||
return display_dst(DELAY_CAPTION)
|
||||
|
||||
|
||||
def display_dst(delay):
|
||||
cv.imshow(window_name, dst)
|
||||
c = cv.waitKey(delay)
|
||||
if c >= 0 : return -1
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
@ -0,0 +1,92 @@
|
||||
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
W = 52 # window size is WxW
|
||||
C_Thr = 0.43 # threshold for coherency
|
||||
LowThr = 35 # threshold1 for orientation, it ranges from 0 to 180
|
||||
HighThr = 57 # threshold2 for orientation, it ranges from 0 to 180
|
||||
|
||||
## [calcGST]
|
||||
## [calcJ_header]
|
||||
## [calcGST_proto]
|
||||
def calcGST(inputIMG, w):
|
||||
## [calcGST_proto]
|
||||
img = inputIMG.astype(np.float32)
|
||||
|
||||
# GST components calculation (start)
|
||||
# J = (J11 J12; J12 J22) - GST
|
||||
imgDiffX = cv.Sobel(img, cv.CV_32F, 1, 0, 3)
|
||||
imgDiffY = cv.Sobel(img, cv.CV_32F, 0, 1, 3)
|
||||
imgDiffXY = cv.multiply(imgDiffX, imgDiffY)
|
||||
## [calcJ_header]
|
||||
|
||||
imgDiffXX = cv.multiply(imgDiffX, imgDiffX)
|
||||
imgDiffYY = cv.multiply(imgDiffY, imgDiffY)
|
||||
|
||||
J11 = cv.boxFilter(imgDiffXX, cv.CV_32F, (w,w))
|
||||
J22 = cv.boxFilter(imgDiffYY, cv.CV_32F, (w,w))
|
||||
J12 = cv.boxFilter(imgDiffXY, cv.CV_32F, (w,w))
|
||||
# GST components calculations (stop)
|
||||
|
||||
# eigenvalue calculation (start)
|
||||
# lambda1 = 0.5*(J11 + J22 + sqrt((J11-J22)^2 + 4*J12^2))
|
||||
# lambda2 = 0.5*(J11 + J22 - sqrt((J11-J22)^2 + 4*J12^2))
|
||||
tmp1 = J11 + J22
|
||||
tmp2 = J11 - J22
|
||||
tmp2 = cv.multiply(tmp2, tmp2)
|
||||
tmp3 = cv.multiply(J12, J12)
|
||||
tmp4 = np.sqrt(tmp2 + 4.0 * tmp3)
|
||||
|
||||
lambda1 = 0.5*(tmp1 + tmp4) # biggest eigenvalue
|
||||
lambda2 = 0.5*(tmp1 - tmp4) # smallest eigenvalue
|
||||
# eigenvalue calculation (stop)
|
||||
|
||||
# Coherency calculation (start)
|
||||
# Coherency = (lambda1 - lambda2)/(lambda1 + lambda2)) - measure of anisotropism
|
||||
# Coherency is anisotropy degree (consistency of local orientation)
|
||||
imgCoherencyOut = cv.divide(lambda1 - lambda2, lambda1 + lambda2)
|
||||
# Coherency calculation (stop)
|
||||
|
||||
# orientation angle calculation (start)
|
||||
# tan(2*Alpha) = 2*J12/(J22 - J11)
|
||||
# Alpha = 0.5 atan2(2*J12/(J22 - J11))
|
||||
imgOrientationOut = cv.phase(J22 - J11, 2.0 * J12, angleInDegrees = True)
|
||||
imgOrientationOut = 0.5 * imgOrientationOut
|
||||
# orientation angle calculation (stop)
|
||||
|
||||
return imgCoherencyOut, imgOrientationOut
|
||||
## [calcGST]
|
||||
|
||||
parser = argparse.ArgumentParser(description='Code for Anisotropic image segmentation tutorial.')
|
||||
parser.add_argument('-i', '--input', help='Path to input image.', required=True)
|
||||
args = parser.parse_args()
|
||||
|
||||
imgIn = cv.imread(args.input, cv.IMREAD_GRAYSCALE)
|
||||
if imgIn is None:
|
||||
print('Could not open or find the image: {}'.format(args.input))
|
||||
exit(0)
|
||||
|
||||
## [main_extra]
|
||||
## [main]
|
||||
imgCoherency, imgOrientation = calcGST(imgIn, W)
|
||||
|
||||
## [thresholding]
|
||||
_, imgCoherencyBin = cv.threshold(imgCoherency, C_Thr, 255, cv.THRESH_BINARY)
|
||||
_, imgOrientationBin = cv.threshold(imgOrientation, LowThr, HighThr, cv.THRESH_BINARY)
|
||||
## [thresholding]
|
||||
|
||||
## [combining]
|
||||
imgBin = cv.bitwise_and(imgCoherencyBin, imgOrientationBin)
|
||||
## [combining]
|
||||
## [main]
|
||||
|
||||
imgCoherency = cv.normalize(imgCoherency, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
|
||||
imgOrientation = cv.normalize(imgOrientation, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
|
||||
|
||||
cv.imshow('result.jpg', np.uint8(0.5*(imgIn + imgBin)))
|
||||
cv.imshow('Coherency.jpg', imgCoherency)
|
||||
cv.imshow('Orientation.jpg', imgOrientation)
|
||||
cv.waitKey(0)
|
||||
## [main_extra]
|
@ -0,0 +1,55 @@
|
||||
from __future__ import print_function
|
||||
from builtins import input
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
# Read image given by user
|
||||
## [basic-linear-transform-load]
|
||||
parser = argparse.ArgumentParser(description='Code for Changing the contrast and brightness of an image! tutorial.')
|
||||
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
|
||||
args = parser.parse_args()
|
||||
|
||||
image = cv.imread(cv.samples.findFile(args.input))
|
||||
if image is None:
|
||||
print('Could not open or find the image: ', args.input)
|
||||
exit(0)
|
||||
## [basic-linear-transform-load]
|
||||
|
||||
## [basic-linear-transform-output]
|
||||
new_image = np.zeros(image.shape, image.dtype)
|
||||
## [basic-linear-transform-output]
|
||||
|
||||
## [basic-linear-transform-parameters]
|
||||
alpha = 1.0 # Simple contrast control
|
||||
beta = 0 # Simple brightness control
|
||||
|
||||
# Initialize values
|
||||
print(' Basic Linear Transforms ')
|
||||
print('-------------------------')
|
||||
try:
|
||||
alpha = float(input('* Enter the alpha value [1.0-3.0]: '))
|
||||
beta = int(input('* Enter the beta value [0-100]: '))
|
||||
except ValueError:
|
||||
print('Error, not a number')
|
||||
## [basic-linear-transform-parameters]
|
||||
|
||||
# Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
||||
# Instead of these 'for' loops we could have used simply:
|
||||
# new_image = cv.convertScaleAbs(image, alpha=alpha, beta=beta)
|
||||
# but we wanted to show you how to access the pixels :)
|
||||
## [basic-linear-transform-operation]
|
||||
for y in range(image.shape[0]):
|
||||
for x in range(image.shape[1]):
|
||||
for c in range(image.shape[2]):
|
||||
new_image[y,x,c] = np.clip(alpha*image[y,x,c] + beta, 0, 255)
|
||||
## [basic-linear-transform-operation]
|
||||
|
||||
## [basic-linear-transform-display]
|
||||
# Show stuff
|
||||
cv.imshow('Original Image', image)
|
||||
cv.imshow('New Image', new_image)
|
||||
|
||||
# Wait until user press some key
|
||||
cv.waitKey()
|
||||
## [basic-linear-transform-display]
|
@ -0,0 +1,74 @@
|
||||
from __future__ import print_function
|
||||
from __future__ import division
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
alpha = 1.0
|
||||
alpha_max = 500
|
||||
beta = 0
|
||||
beta_max = 200
|
||||
gamma = 1.0
|
||||
gamma_max = 200
|
||||
|
||||
def basicLinearTransform():
|
||||
res = cv.convertScaleAbs(img_original, alpha=alpha, beta=beta)
|
||||
img_corrected = cv.hconcat([img_original, res])
|
||||
cv.imshow("Brightness and contrast adjustments", img_corrected)
|
||||
|
||||
def gammaCorrection():
|
||||
## [changing-contrast-brightness-gamma-correction]
|
||||
lookUpTable = np.empty((1,256), np.uint8)
|
||||
for i in range(256):
|
||||
lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
|
||||
|
||||
res = cv.LUT(img_original, lookUpTable)
|
||||
## [changing-contrast-brightness-gamma-correction]
|
||||
|
||||
img_gamma_corrected = cv.hconcat([img_original, res])
|
||||
cv.imshow("Gamma correction", img_gamma_corrected)
|
||||
|
||||
def on_linear_transform_alpha_trackbar(val):
|
||||
global alpha
|
||||
alpha = val / 100
|
||||
basicLinearTransform()
|
||||
|
||||
def on_linear_transform_beta_trackbar(val):
|
||||
global beta
|
||||
beta = val - 100
|
||||
basicLinearTransform()
|
||||
|
||||
def on_gamma_correction_trackbar(val):
|
||||
global gamma
|
||||
gamma = val / 100
|
||||
gammaCorrection()
|
||||
|
||||
parser = argparse.ArgumentParser(description='Code for Changing the contrast and brightness of an image! tutorial.')
|
||||
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
|
||||
args = parser.parse_args()
|
||||
|
||||
img_original = cv.imread(cv.samples.findFile(args.input))
|
||||
if img_original is None:
|
||||
print('Could not open or find the image: ', args.input)
|
||||
exit(0)
|
||||
|
||||
img_corrected = np.empty((img_original.shape[0], img_original.shape[1]*2, img_original.shape[2]), img_original.dtype)
|
||||
img_gamma_corrected = np.empty((img_original.shape[0], img_original.shape[1]*2, img_original.shape[2]), img_original.dtype)
|
||||
|
||||
img_corrected = cv.hconcat([img_original, img_original])
|
||||
img_gamma_corrected = cv.hconcat([img_original, img_original])
|
||||
|
||||
cv.namedWindow('Brightness and contrast adjustments')
|
||||
cv.namedWindow('Gamma correction')
|
||||
|
||||
alpha_init = int(alpha *100)
|
||||
cv.createTrackbar('Alpha gain (contrast)', 'Brightness and contrast adjustments', alpha_init, alpha_max, on_linear_transform_alpha_trackbar)
|
||||
beta_init = beta + 100
|
||||
cv.createTrackbar('Beta bias (brightness)', 'Brightness and contrast adjustments', beta_init, beta_max, on_linear_transform_beta_trackbar)
|
||||
gamma_init = int(gamma * 100)
|
||||
cv.createTrackbar('Gamma correction', 'Gamma correction', gamma_init, gamma_max, on_gamma_correction_trackbar)
|
||||
|
||||
on_linear_transform_alpha_trackbar(alpha_init)
|
||||
on_gamma_correction_trackbar(gamma_init)
|
||||
|
||||
cv.waitKey()
|
78
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/erosion_dilatation/morphology_1.py
vendored
Normal file
78
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/erosion_dilatation/morphology_1.py
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
from __future__ import print_function
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
src = None
|
||||
erosion_size = 0
|
||||
max_elem = 2
|
||||
max_kernel_size = 21
|
||||
title_trackbar_element_shape = 'Element:\n 0: Rect \n 1: Cross \n 2: Ellipse'
|
||||
title_trackbar_kernel_size = 'Kernel size:\n 2n +1'
|
||||
title_erosion_window = 'Erosion Demo'
|
||||
title_dilation_window = 'Dilation Demo'
|
||||
|
||||
|
||||
## [main]
|
||||
def main(image):
|
||||
global src
|
||||
src = cv.imread(cv.samples.findFile(image))
|
||||
if src is None:
|
||||
print('Could not open or find the image: ', image)
|
||||
exit(0)
|
||||
|
||||
cv.namedWindow(title_erosion_window)
|
||||
cv.createTrackbar(title_trackbar_element_shape, title_erosion_window, 0, max_elem, erosion)
|
||||
cv.createTrackbar(title_trackbar_kernel_size, title_erosion_window, 0, max_kernel_size, erosion)
|
||||
|
||||
cv.namedWindow(title_dilation_window)
|
||||
cv.createTrackbar(title_trackbar_element_shape, title_dilation_window, 0, max_elem, dilatation)
|
||||
cv.createTrackbar(title_trackbar_kernel_size, title_dilation_window, 0, max_kernel_size, dilatation)
|
||||
|
||||
erosion(0)
|
||||
dilatation(0)
|
||||
cv.waitKey()
|
||||
## [main]
|
||||
|
||||
# optional mapping of values with morphological shapes
|
||||
def morph_shape(val):
|
||||
if val == 0:
|
||||
return cv.MORPH_RECT
|
||||
elif val == 1:
|
||||
return cv.MORPH_CROSS
|
||||
elif val == 2:
|
||||
return cv.MORPH_ELLIPSE
|
||||
|
||||
|
||||
## [erosion]
|
||||
def erosion(val):
|
||||
erosion_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_erosion_window)
|
||||
erosion_shape = morph_shape(cv.getTrackbarPos(title_trackbar_element_shape, title_erosion_window))
|
||||
|
||||
## [kernel]
|
||||
element = cv.getStructuringElement(erosion_shape, (2 * erosion_size + 1, 2 * erosion_size + 1),
|
||||
(erosion_size, erosion_size))
|
||||
## [kernel]
|
||||
erosion_dst = cv.erode(src, element)
|
||||
cv.imshow(title_erosion_window, erosion_dst)
|
||||
## [erosion]
|
||||
|
||||
|
||||
## [dilation]
|
||||
def dilatation(val):
|
||||
dilatation_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_dilation_window)
|
||||
dilation_shape = morph_shape(cv.getTrackbarPos(title_trackbar_element_shape, title_dilation_window))
|
||||
|
||||
element = cv.getStructuringElement(dilation_shape, (2 * dilatation_size + 1, 2 * dilatation_size + 1),
|
||||
(dilatation_size, dilatation_size))
|
||||
dilatation_dst = cv.dilate(src, element)
|
||||
cv.imshow(title_dilation_window, dilatation_dst)
|
||||
## [dilation]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Code for Eroding and Dilating tutorial.')
|
||||
parser.add_argument('--input', help='Path to input image.', default='LinuxLogo.jpg')
|
||||
args = parser.parse_args()
|
||||
|
||||
main(args.input)
|
@ -0,0 +1,22 @@
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
|
||||
img = cv.imread(cv.samples.findFile('sudoku.png'))
|
||||
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
|
||||
edges = cv.Canny(gray,50,150,apertureSize = 3)
|
||||
|
||||
lines = cv.HoughLines(edges,1,np.pi/180,200)
|
||||
for line in lines:
|
||||
rho,theta = line[0]
|
||||
a = np.cos(theta)
|
||||
b = np.sin(theta)
|
||||
x0 = a*rho
|
||||
y0 = b*rho
|
||||
x1 = int(x0 + 1000*(-b))
|
||||
y1 = int(y0 + 1000*(a))
|
||||
x2 = int(x0 - 1000*(-b))
|
||||
y2 = int(y0 - 1000*(a))
|
||||
|
||||
cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)
|
||||
|
||||
cv.imwrite('houghlines3.jpg',img)
|
@ -0,0 +1,12 @@
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
|
||||
img = cv.imread(cv.samples.findFile('sudoku.png'))
|
||||
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
|
||||
edges = cv.Canny(gray,50,150,apertureSize = 3)
|
||||
lines = cv.HoughLinesP(edges,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
|
||||
for line in lines:
|
||||
x1,y1,x2,y2 = line[0]
|
||||
cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)
|
||||
|
||||
cv.imwrite('houghlines5.jpg',img)
|
97
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/match_template/match_template.py
vendored
Normal file
97
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/match_template/match_template.py
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
import cv2 as cv
|
||||
|
||||
## [global_variables]
|
||||
use_mask = False
|
||||
img = None
|
||||
templ = None
|
||||
mask = None
|
||||
image_window = "Source Image"
|
||||
result_window = "Result window"
|
||||
|
||||
match_method = 0
|
||||
max_Trackbar = 5
|
||||
## [global_variables]
|
||||
|
||||
def main(argv):
|
||||
|
||||
if (len(sys.argv) < 3):
|
||||
print('Not enough parameters')
|
||||
print('Usage:\nmatch_template_demo.py <image_name> <template_name> [<mask_name>]')
|
||||
return -1
|
||||
|
||||
## [load_image]
|
||||
global img
|
||||
global templ
|
||||
img = cv.imread(sys.argv[1], cv.IMREAD_COLOR)
|
||||
templ = cv.imread(sys.argv[2], cv.IMREAD_COLOR)
|
||||
|
||||
if (len(sys.argv) > 3):
|
||||
global use_mask
|
||||
use_mask = True
|
||||
global mask
|
||||
mask = cv.imread( sys.argv[3], cv.IMREAD_COLOR )
|
||||
|
||||
if ((img is None) or (templ is None) or (use_mask and (mask is None))):
|
||||
print('Can\'t read one of the images')
|
||||
return -1
|
||||
## [load_image]
|
||||
|
||||
## [create_windows]
|
||||
cv.namedWindow( image_window, cv.WINDOW_AUTOSIZE )
|
||||
cv.namedWindow( result_window, cv.WINDOW_AUTOSIZE )
|
||||
## [create_windows]
|
||||
|
||||
## [create_trackbar]
|
||||
trackbar_label = 'Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED'
|
||||
cv.createTrackbar( trackbar_label, image_window, match_method, max_Trackbar, MatchingMethod )
|
||||
## [create_trackbar]
|
||||
|
||||
MatchingMethod(match_method)
|
||||
|
||||
## [wait_key]
|
||||
cv.waitKey(0)
|
||||
return 0
|
||||
## [wait_key]
|
||||
|
||||
def MatchingMethod(param):
|
||||
|
||||
global match_method
|
||||
match_method = param
|
||||
|
||||
## [copy_source]
|
||||
img_display = img.copy()
|
||||
## [copy_source]
|
||||
## [match_template]
|
||||
method_accepts_mask = (cv.TM_SQDIFF == match_method or match_method == cv.TM_CCORR_NORMED)
|
||||
if (use_mask and method_accepts_mask):
|
||||
result = cv.matchTemplate(img, templ, match_method, None, mask)
|
||||
else:
|
||||
result = cv.matchTemplate(img, templ, match_method)
|
||||
## [match_template]
|
||||
|
||||
## [normalize]
|
||||
cv.normalize( result, result, 0, 1, cv.NORM_MINMAX, -1 )
|
||||
## [normalize]
|
||||
## [best_match]
|
||||
_minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None)
|
||||
## [best_match]
|
||||
|
||||
## [match_loc]
|
||||
if (match_method == cv.TM_SQDIFF or match_method == cv.TM_SQDIFF_NORMED):
|
||||
matchLoc = minLoc
|
||||
else:
|
||||
matchLoc = maxLoc
|
||||
## [match_loc]
|
||||
|
||||
## [imshow]
|
||||
cv.rectangle(img_display, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,0,0), 2, 8, 0 )
|
||||
cv.rectangle(result, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,0,0), 2, 8, 0 )
|
||||
cv.imshow(image_window, img_display)
|
||||
cv.imshow(result_window, result)
|
||||
## [imshow]
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
@ -0,0 +1,136 @@
|
||||
"""
|
||||
@file morph_lines_detection.py
|
||||
@brief Use morphology transformations for extracting horizontal and vertical lines sample code
|
||||
"""
|
||||
import numpy as np
|
||||
import sys
|
||||
import cv2 as cv
|
||||
|
||||
|
||||
def show_wait_destroy(winname, img):
|
||||
cv.imshow(winname, img)
|
||||
cv.moveWindow(winname, 500, 0)
|
||||
cv.waitKey(0)
|
||||
cv.destroyWindow(winname)
|
||||
|
||||
|
||||
def main(argv):
|
||||
# [load_image]
|
||||
# Check number of arguments
|
||||
if len(argv) < 1:
|
||||
print ('Not enough parameters')
|
||||
print ('Usage:\nmorph_lines_detection.py < path_to_image >')
|
||||
return -1
|
||||
|
||||
# Load the image
|
||||
src = cv.imread(argv[0], cv.IMREAD_COLOR)
|
||||
|
||||
# Check if image is loaded fine
|
||||
if src is None:
|
||||
print ('Error opening image: ' + argv[0])
|
||||
return -1
|
||||
|
||||
# Show source image
|
||||
cv.imshow("src", src)
|
||||
# [load_image]
|
||||
|
||||
# [gray]
|
||||
# Transform source image to gray if it is not already
|
||||
if len(src.shape) != 2:
|
||||
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
|
||||
else:
|
||||
gray = src
|
||||
|
||||
# Show gray image
|
||||
show_wait_destroy("gray", gray)
|
||||
# [gray]
|
||||
|
||||
# [bin]
|
||||
# Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
|
||||
gray = cv.bitwise_not(gray)
|
||||
bw = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, \
|
||||
cv.THRESH_BINARY, 15, -2)
|
||||
# Show binary image
|
||||
show_wait_destroy("binary", bw)
|
||||
# [bin]
|
||||
|
||||
# [init]
|
||||
# Create the images that will use to extract the horizontal and vertical lines
|
||||
horizontal = np.copy(bw)
|
||||
vertical = np.copy(bw)
|
||||
# [init]
|
||||
|
||||
# [horiz]
|
||||
# Specify size on horizontal axis
|
||||
cols = horizontal.shape[1]
|
||||
horizontal_size = cols // 30
|
||||
|
||||
# Create structure element for extracting horizontal lines through morphology operations
|
||||
horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
|
||||
|
||||
# Apply morphology operations
|
||||
horizontal = cv.erode(horizontal, horizontalStructure)
|
||||
horizontal = cv.dilate(horizontal, horizontalStructure)
|
||||
|
||||
# Show extracted horizontal lines
|
||||
show_wait_destroy("horizontal", horizontal)
|
||||
# [horiz]
|
||||
|
||||
# [vert]
|
||||
# Specify size on vertical axis
|
||||
rows = vertical.shape[0]
|
||||
verticalsize = rows // 30
|
||||
|
||||
# Create structure element for extracting vertical lines through morphology operations
|
||||
verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))
|
||||
|
||||
# Apply morphology operations
|
||||
vertical = cv.erode(vertical, verticalStructure)
|
||||
vertical = cv.dilate(vertical, verticalStructure)
|
||||
|
||||
# Show extracted vertical lines
|
||||
show_wait_destroy("vertical", vertical)
|
||||
# [vert]
|
||||
|
||||
# [smooth]
|
||||
# Inverse vertical image
|
||||
vertical = cv.bitwise_not(vertical)
|
||||
show_wait_destroy("vertical_bit", vertical)
|
||||
|
||||
'''
|
||||
Extract edges and smooth image according to the logic
|
||||
1. extract edges
|
||||
2. dilate(edges)
|
||||
3. src.copyTo(smooth)
|
||||
4. blur smooth img
|
||||
5. smooth.copyTo(src, edges)
|
||||
'''
|
||||
|
||||
# Step 1
|
||||
edges = cv.adaptiveThreshold(vertical, 255, cv.ADAPTIVE_THRESH_MEAN_C, \
|
||||
cv.THRESH_BINARY, 3, -2)
|
||||
show_wait_destroy("edges", edges)
|
||||
|
||||
# Step 2
|
||||
kernel = np.ones((2, 2), np.uint8)
|
||||
edges = cv.dilate(edges, kernel)
|
||||
show_wait_destroy("dilate", edges)
|
||||
|
||||
# Step 3
|
||||
smooth = np.copy(vertical)
|
||||
|
||||
# Step 4
|
||||
smooth = cv.blur(smooth, (2, 2))
|
||||
|
||||
# Step 5
|
||||
(rows, cols) = np.where(edges != 0)
|
||||
vertical[rows, cols] = smooth[rows, cols]
|
||||
|
||||
# Show final result
|
||||
show_wait_destroy("smooth - final", vertical)
|
||||
# [smooth]
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
48
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/opening_closing_hats/morphology_2.py
vendored
Normal file
48
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/opening_closing_hats/morphology_2.py
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
from __future__ import print_function
|
||||
import cv2 as cv
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
morph_size = 0
|
||||
max_operator = 4
|
||||
max_elem = 2
|
||||
max_kernel_size = 21
|
||||
title_trackbar_operator_type = 'Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat'
|
||||
title_trackbar_element_type = 'Element:\n 0: Rect - 1: Cross - 2: Ellipse'
|
||||
title_trackbar_kernel_size = 'Kernel size:\n 2n + 1'
|
||||
title_window = 'Morphology Transformations Demo'
|
||||
morph_op_dic = {0: cv.MORPH_OPEN, 1: cv.MORPH_CLOSE, 2: cv.MORPH_GRADIENT, 3: cv.MORPH_TOPHAT, 4: cv.MORPH_BLACKHAT}
|
||||
|
||||
def morphology_operations(val):
|
||||
morph_operator = cv.getTrackbarPos(title_trackbar_operator_type, title_window)
|
||||
morph_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_window)
|
||||
morph_elem = 0
|
||||
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_window)
|
||||
if val_type == 0:
|
||||
morph_elem = cv.MORPH_RECT
|
||||
elif val_type == 1:
|
||||
morph_elem = cv.MORPH_CROSS
|
||||
elif val_type == 2:
|
||||
morph_elem = cv.MORPH_ELLIPSE
|
||||
|
||||
element = cv.getStructuringElement(morph_elem, (2*morph_size + 1, 2*morph_size+1), (morph_size, morph_size))
|
||||
operation = morph_op_dic[morph_operator]
|
||||
dst = cv.morphologyEx(src, operation, element)
|
||||
cv.imshow(title_window, dst)
|
||||
|
||||
parser = argparse.ArgumentParser(description='Code for More Morphology Transformations tutorial.')
|
||||
parser.add_argument('--input', help='Path to input image.', default='LinuxLogo.jpg')
|
||||
args = parser.parse_args()
|
||||
|
||||
src = cv.imread(cv.samples.findFile(args.input))
|
||||
if src is None:
|
||||
print('Could not open or find the image: ', args.input)
|
||||
exit(0)
|
||||
|
||||
cv.namedWindow(title_window)
|
||||
cv.createTrackbar(title_trackbar_operator_type, title_window , 0, max_operator, morphology_operations)
|
||||
cv.createTrackbar(title_trackbar_element_type, title_window , 0, max_elem, morphology_operations)
|
||||
cv.createTrackbar(title_trackbar_kernel_size, title_window , 0, max_kernel_size, morphology_operations)
|
||||
|
||||
morphology_operations(0)
|
||||
cv.waitKey()
|
54
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/threshold/threshold.py
vendored
Normal file
54
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/threshold/threshold.py
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
from __future__ import print_function
|
||||
import cv2 as cv
|
||||
import argparse
|
||||
|
||||
max_value = 255
|
||||
max_type = 4
|
||||
max_binary_value = 255
|
||||
trackbar_type = 'Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted'
|
||||
trackbar_value = 'Value'
|
||||
window_name = 'Threshold Demo'
|
||||
|
||||
## [Threshold_Demo]
|
||||
def Threshold_Demo(val):
|
||||
#0: Binary
|
||||
#1: Binary Inverted
|
||||
#2: Threshold Truncated
|
||||
#3: Threshold to Zero
|
||||
#4: Threshold to Zero Inverted
|
||||
threshold_type = cv.getTrackbarPos(trackbar_type, window_name)
|
||||
threshold_value = cv.getTrackbarPos(trackbar_value, window_name)
|
||||
_, dst = cv.threshold(src_gray, threshold_value, max_binary_value, threshold_type )
|
||||
cv.imshow(window_name, dst)
|
||||
## [Threshold_Demo]
|
||||
|
||||
parser = argparse.ArgumentParser(description='Code for Basic Thresholding Operations tutorial.')
|
||||
parser.add_argument('--input', help='Path to input image.', default='stuff.jpg')
|
||||
args = parser.parse_args()
|
||||
|
||||
## [load]
|
||||
# Load an image
|
||||
src = cv.imread(cv.samples.findFile(args.input))
|
||||
if src is None:
|
||||
print('Could not open or find the image: ', args.input)
|
||||
exit(0)
|
||||
# Convert the image to Gray
|
||||
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
|
||||
## [load]
|
||||
|
||||
## [window]
|
||||
# Create a window to display results
|
||||
cv.namedWindow(window_name)
|
||||
## [window]
|
||||
|
||||
## [trackbar]
|
||||
# Create Trackbar to choose type of Threshold
|
||||
cv.createTrackbar(trackbar_type, window_name , 3, max_type, Threshold_Demo)
|
||||
# Create Trackbar to choose Threshold value
|
||||
cv.createTrackbar(trackbar_value, window_name , 0, max_value, Threshold_Demo)
|
||||
## [trackbar]
|
||||
|
||||
# Call the function to initialize
|
||||
Threshold_Demo(0)
|
||||
# Wait until user finishes program
|
||||
cv.waitKey()
|
107
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py
vendored
Normal file
107
3rdparty/opencv-4.5.4/samples/python/tutorial_code/imgProc/threshold_inRange/threshold_inRange.py
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
from __future__ import print_function
|
||||
import cv2 as cv
|
||||
import argparse
|
||||
|
||||
max_value = 255
|
||||
max_value_H = 360//2
|
||||
low_H = 0
|
||||
low_S = 0
|
||||
low_V = 0
|
||||
high_H = max_value_H
|
||||
high_S = max_value
|
||||
high_V = max_value
|
||||
window_capture_name = 'Video Capture'
|
||||
window_detection_name = 'Object Detection'
|
||||
low_H_name = 'Low H'
|
||||
low_S_name = 'Low S'
|
||||
low_V_name = 'Low V'
|
||||
high_H_name = 'High H'
|
||||
high_S_name = 'High S'
|
||||
high_V_name = 'High V'
|
||||
|
||||
## [low]
|
||||
def on_low_H_thresh_trackbar(val):
|
||||
global low_H
|
||||
global high_H
|
||||
low_H = val
|
||||
low_H = min(high_H-1, low_H)
|
||||
cv.setTrackbarPos(low_H_name, window_detection_name, low_H)
|
||||
## [low]
|
||||
|
||||
## [high]
|
||||
def on_high_H_thresh_trackbar(val):
|
||||
global low_H
|
||||
global high_H
|
||||
high_H = val
|
||||
high_H = max(high_H, low_H+1)
|
||||
cv.setTrackbarPos(high_H_name, window_detection_name, high_H)
|
||||
## [high]
|
||||
|
||||
def on_low_S_thresh_trackbar(val):
|
||||
global low_S
|
||||
global high_S
|
||||
low_S = val
|
||||
low_S = min(high_S-1, low_S)
|
||||
cv.setTrackbarPos(low_S_name, window_detection_name, low_S)
|
||||
|
||||
def on_high_S_thresh_trackbar(val):
|
||||
global low_S
|
||||
global high_S
|
||||
high_S = val
|
||||
high_S = max(high_S, low_S+1)
|
||||
cv.setTrackbarPos(high_S_name, window_detection_name, high_S)
|
||||
|
||||
def on_low_V_thresh_trackbar(val):
|
||||
global low_V
|
||||
global high_V
|
||||
low_V = val
|
||||
low_V = min(high_V-1, low_V)
|
||||
cv.setTrackbarPos(low_V_name, window_detection_name, low_V)
|
||||
|
||||
def on_high_V_thresh_trackbar(val):
|
||||
global low_V
|
||||
global high_V
|
||||
high_V = val
|
||||
high_V = max(high_V, low_V+1)
|
||||
cv.setTrackbarPos(high_V_name, window_detection_name, high_V)
|
||||
|
||||
parser = argparse.ArgumentParser(description='Code for Thresholding Operations using inRange tutorial.')
|
||||
parser.add_argument('--camera', help='Camera divide number.', default=0, type=int)
|
||||
args = parser.parse_args()
|
||||
|
||||
## [cap]
|
||||
cap = cv.VideoCapture(args.camera)
|
||||
## [cap]
|
||||
|
||||
## [window]
|
||||
cv.namedWindow(window_capture_name)
|
||||
cv.namedWindow(window_detection_name)
|
||||
## [window]
|
||||
|
||||
## [trackbar]
|
||||
cv.createTrackbar(low_H_name, window_detection_name , low_H, max_value_H, on_low_H_thresh_trackbar)
|
||||
cv.createTrackbar(high_H_name, window_detection_name , high_H, max_value_H, on_high_H_thresh_trackbar)
|
||||
cv.createTrackbar(low_S_name, window_detection_name , low_S, max_value, on_low_S_thresh_trackbar)
|
||||
cv.createTrackbar(high_S_name, window_detection_name , high_S, max_value, on_high_S_thresh_trackbar)
|
||||
cv.createTrackbar(low_V_name, window_detection_name , low_V, max_value, on_low_V_thresh_trackbar)
|
||||
cv.createTrackbar(high_V_name, window_detection_name , high_V, max_value, on_high_V_thresh_trackbar)
|
||||
## [trackbar]
|
||||
|
||||
while True:
|
||||
## [while]
|
||||
ret, frame = cap.read()
|
||||
if frame is None:
|
||||
break
|
||||
|
||||
frame_HSV = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
|
||||
frame_threshold = cv.inRange(frame_HSV, (low_H, low_S, low_V), (high_H, high_S, high_V))
|
||||
## [while]
|
||||
|
||||
## [show]
|
||||
cv.imshow(window_capture_name, frame)
|
||||
cv.imshow(window_detection_name, frame_threshold)
|
||||
## [show]
|
||||
|
||||
key = cv.waitKey(30)
|
||||
if key == ord('q') or key == 27:
|
||||
break
|
Reference in New Issue
Block a user