Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3

21 直线检测

import cv2 as cv
import numpy as np

def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    lines = cv.HoughLines(edges, 1, np.pi/180, 200)#半径步长为1,每次偏转1度,直线最小长度200
    for line in lines:
        #print(type(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(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
    cv.imshow("line_detection", image)

def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    lines = cv.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=100, maxLineGap=15)
    for line in lines:
        #print(type(line))
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("line_detect_possible_demo", image)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/fangge.png")
src1=src.copy()
src2=src.copy()

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

line_detection(src1)
line_detect_possible_demo(src2)
cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第1张图片

22 圆检测

import cv2 as cv
import numpy as np

def detect_circles_demo(image):
    dst = cv.pyrMeanShiftFiltering(image, 10, 100)
    cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
    #步长为1,最小圆心距20
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)#圆圈
        cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)#圆心
    cv.imshow("circles", image)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/coins_001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
detect_circles_demo(src)
cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第2张图片

23 轮廓发现

import cv2 as cv
import numpy as np

def edge_demo(image):
    blurred = cv.GaussianBlur(image, (3, 3), 0)
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    edge_output = cv.Canny(gray, 30, 100)
    cv.imshow("Canny Edge", edge_output)
    return edge_output

def edge_contours_demo(image):
    binary = edge_demo(image)
    cv.imshow("canny binary", binary)

    cloneImage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), 2)#最后一个参数为-1时表示填充
        approxCurve = cv.approxPolyDP(contour, 4, True)
        if approxCurve.shape[0] > 6:
            cv.drawContours(image, contours, i, (255, 0, 0), 2)
        if approxCurve.shape[0] == 4:
            cv.drawContours(image, contours, i, (0, 255, 0), 2)
        #print(approxCurve.shape[0])
        #print(i)
    cv.imshow("edge detect contours", image)

def contours_demo(image):
    dst = cv.GaussianBlur(image, (3, 3), 0)
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary image", binary)
   # binary = edge_demo(image)

    cloneImage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(image, contours, i, (0, 0, 255), 2)#最后一个参数为-1时表示填充
        approxCurve = cv.approxPolyDP(contour, 4, True)
        if approxCurve.shape[0] > 6:
            cv.drawContours(image, contours, i, (255, 0, 0), 2)
        if approxCurve.shape[0] == 4:
            cv.drawContours(image, contours, i, (0, 255, 0), 2)
        #print(approxCurve.shape[0])
        #print(i)
    cv.imshow("detect contours", image)


print("--------- Python OpenCV Tutorial ---------")
#src = cv.imread("D:/vcprojects/images/coins_001.jpg")
src = cv.imread("D:/vcprojects/images/blob1.png")

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
src1=src.copy()
src2=src.copy()

contours_demo(src1)
edge_contours_demo(src2)

cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第3张图片

24 对象检测

import cv2 as cv
import numpy as np

def measure_object(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    print("threshold value : %s"%ret)
    cv.imshow("binary image", binary)
    dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
    outImage, contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    print("--------------------------------")

    for i, contour in enumerate(contours):
        area = cv.contourArea(contour)#轮廓面积
        x, y, w, h = cv.boundingRect(contour)#外接矩形
        rate = min(w, h)/max(w, h)#宽高比
        print("rectangle rate : %s"%rate)

        mm = cv.moments(contour)#计算图像中的中心矩
        #print(type(mm))
        #重心坐标xc,yc
        cx = mm['m10']/mm['m00']
        cy = mm['m01']/mm['m00']
        cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
        cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)
        print("contour area :%s"%area)
        print("--------------------------------")

        cv.drawContours(image, contours, i, (0, 255, 0), 2)
    cv.imshow("measure-contours", image)

def measure_object1(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print("threshold value : %s"%ret)
    cv.imshow("binary image1", binary)
    dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
    outImage, contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    print("--------------------------------")

    for i, contour in enumerate(contours):
        area = cv.contourArea(contour)#轮廓面积
        x, y, w, h = cv.boundingRect(contour)#外接矩形
        rate = min(w, h)/max(w, h)#宽高比
        print("rectangle rate : %s"%rate)

        mm = cv.moments(contour)#计算图像中的中心矩
        #print(type(mm))
        #重心坐标xc,yc
        cx = mm['m10']/mm['m00']
        cy = mm['m01']/mm['m00']
        cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
        cv.rectangle(dst, (x, y), (x+w, y+h), (0, 0, 255), 2)
        print("contour area :%s"%area)
        print("--------------------------------")

        approxCurve = cv.approxPolyDP(contour, 4, True)
        #print(approxCurve.shape)
        if approxCurve.shape[0] > 6:#圆
            cv.drawContours(image, contours, i, (0, 255, 0), 2)
        if approxCurve.shape[0] == 4:
            cv.drawContours(image, contours, i, (0, 0, 255), 2)
        if approxCurve.shape[0] == 3:#三角形
            cv.drawContours(image, contours, i, (255, 0, 0), 2)
    cv.imshow("measure-contours1", image)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/digitss.png")
src1 = cv.imread("D:/vcprojects/images/blob1.png")

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
cv.imshow("input image1", src1)
src2=src.copy()
src3=src1.copy()

measure_object(src2)
measure_object1(src3)
cv.waitKey(0)

cv.destroyAllWindows()
--------- Python OpenCV Tutorial ---------
threshold value : 90.0
--------------------------------
rectangle rate : 0.9764705882352941
contour area :5344.0
--------------------------------
rectangle rate : 0.7325581395348837
contour area :1326.5
--------------------------------
rectangle rate : 0.8571428571428571
contour area :1819.0
--------------------------------
rectangle rate : 0.2441860465116279
contour area :646.0
--------------------------------
rectangle rate : 0.7294117647058823
contour area :1314.5
--------------------------------
rectangle rate : 0.5476190476190477
contour area :2696.0
--------------------------------
rectangle rate : 0.49
contour area :2282.5
--------------------------------
rectangle rate : 0.5824175824175825
contour area :1402.0
--------------------------------
threshold value : 54.0
--------------------------------
rectangle rate : 0.2129032258064516
contour area :4928.0
--------------------------------
rectangle rate : 0.15163934426229508
contour area :8746.0
--------------------------------
rectangle rate : 0.6825396825396826
contour area :12471.5
--------------------------------
rectangle rate : 0.972972972972973
contour area :977.0
--------------------------------
rectangle rate : 1.0
contour area :1425.5
--------------------------------
rectangle rate : 0.975609756097561
contour area :1227.0
--------------------------------
rectangle rate : 0.975609756097561
contour area :11372.0
--------------------------------
rectangle rate : 0.9111111111111111
contour area :7202.5
--------------------------------
rectangle rate : 0.21962616822429906
contour area :9797.0
--------------------------------
rectangle rate : 0.17972350230414746
contour area :6580.5
--------------------------------

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第4张图片

25 膨胀与腐蚀

import cv2 as cv
import numpy as np

def erode_demo(image):#腐蚀
    #print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))#结构元素为矩形
    dst = cv.erode(binary, kernel)#腐蚀
    cv.imshow("erode_demo", dst)

def dilate_demo(image):#膨胀
    #print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    dst = cv.dilate(binary, kernel)
    cv.imshow("dilate_demo", dst)

print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/5.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
src1=src.copy()
src2=src.copy()

erode_demo(src1)
dilate_demo(src2)

cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第5张图片

import cv2 as cv
import numpy as np

def erode_demo(image):#腐蚀
    #print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))#结构元素为矩形
    dst = cv.erode(binary, kernel)#腐蚀
    cv.imshow("erode_demo", dst)

def dilate_demo(image):#膨胀
    #print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    dst = cv.dilate(binary, kernel)
    cv.imshow("dilate_demo", dst)

print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/bin2.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
src1=src.copy()
src2=src.copy()

erode_demo(src1)
dilate_demo(src2)

# kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
# dst = cv.erode(src, kernel)
# cv.imshow("result", dst)
cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第6张图片

26 开闭操作

import cv2 as cv
import numpy as np

def open_demo(image):#开操作=腐蚀+膨胀  去外边白点
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (15, 15))
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open-result", binary)

def close_demo(image):#闭操作=膨胀+腐蚀 填充里边黑点
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
    cv.imshow("close_demo", binary)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/bin2.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
close_demo(src)

cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第7张图片

import cv2 as cv
import numpy as np

def open_shuiping_demo(image):#开操作=腐蚀+膨胀  去外边白点 填充里边黑点,提取水平或垂直线
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1))#提取水平线
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open_shuiping_demo", binary)

def open_shuzhi_demo(image):#开操作=腐蚀+膨胀  去外边白点 填充里边黑点,提取水平或垂直线
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 15))#提取垂直线
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open_shuzhi_demo", binary)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/morph01.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_shuiping_demo(src)
open_shuzhi_demo(src)

cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第8张图片

import cv2 as cv
import numpy as np

def open_demo(image):#开操作=腐蚀+膨胀  去外边白点 填充里边黑点,提取水平或垂直线
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (4,4))
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open__demo", binary)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/abcd.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)

cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第9张图片

import cv2 as cv
import numpy as np

def open_demo(image):#开操作=腐蚀+膨胀  去外边白点 填充里边黑点,提取水平或垂直线
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    cv.imshow("open__demo", binary)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/zhifang_ball.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)


cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第10张图片

27 其它形态学操作

import cv2 as cv
import numpy as np

def tophat_demo(image):#顶帽=原图-开操作(腐蚀+膨胀)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    dst = cv.morphologyEx(gray, cv.MORPH_TOPHAT, kernel)

    #增加亮度
    cimage = np.array(gray.shape, np.uint8)
    cimage = 100
    dst = cv.add(dst, cimage)
    cv.imshow("tophat", dst)

def blackhat_demo(image):#黑帽=闭操作(膨胀+腐蚀)-原图
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    dst = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel)

    #增加亮度
    cimage = np.array(gray.shape, np.uint8)
    cimage = 100
    dst = cv.add(dst, cimage)
    cv.imshow("blackhat", dst)

def tophat_binary_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    dst = cv.morphologyEx(binary, cv.MORPH_TOPHAT, kernel)
    cv.imshow("tophat binary", dst)

def blackhat_binary_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
    dst = cv.morphologyEx(binary, cv.MORPH_BLACKHAT, kernel)
    cv.imshow("blackhat binary", dst)

def base_gradient_demo(image):#基本梯度=膨胀-腐蚀
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)
    cv.imshow("base gradient", dst)

def gradient2_demo(image):
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    pengzhang = cv.dilate(image, kernel)
    fushi = cv.erode(image, kernel)
    dst1 = cv.subtract(image, fushi) # 内部梯度=原图-腐蚀
    dst2 = cv.subtract(pengzhang, image) # 外部梯度=膨胀-原图
    cv.imshow("internal gradient", dst1)
    cv.imshow("external gradient", dst2)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/bin2.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

tophat_demo(src)
blackhat_demo(src)

tophat_binary_demo(src)
blackhat_binary_demo(src)

base_gradient_demo(src)
gradient2_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第11张图片

28 分水岭算法

import cv2 as cv
import numpy as np

def watershed_demo():
    # remove noise if any 去噪
    #print(src.shape)
    blurred = cv.pyrMeanShiftFiltering(src, 10, 100)
    # gray\binary image 灰度、二值化
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary-image", binary)

    # morphology operation 形态学操作
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)#2次开操作
    sure_bg = cv.dilate(mb, kernel, iterations=3)#3次膨胀
    cv.imshow("mor-opt", sure_bg)

    # distance transform 距离变换
    dist = cv.distanceTransform(mb, cv.DIST_L2, 3)
    dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
    cv.imshow("distance-t", dist_output*50)

    ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)

    surface_fg = np.uint8(surface)
    cv.imshow("surface-bin", surface_fg)
    unknown = cv.subtract(sure_bg, surface_fg)#未知区域,种子以外的区域
    ret, markers = cv.connectedComponents(surface_fg)

    # watershed transform 分水岭变换
    markers = markers + 1
    markers[unknown==255] = 0
    markers = cv.watershed(src, markers=markers)
    src[markers==-1] = [0, 0, 255]
    cv.imshow("result", src)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/coins_001.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
watershed_demo()
cv.waitKey(0)

cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第12张图片

29 人脸检测

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier("D:/opencv342/data/haarcascades/haarcascade_frontalface_alt_tree.xml")
    #face_detector = cv.CascadeClassifier("D:/opencv342/data/lbpcascades/lbpcascade_frontalcatface.xml")
    #下载地址:https://github.com/opencv/opencv
    faces = face_detector.detectMultiScale(gray, 1.02, 4)
    for x, y, w, h in faces:
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
    cv.imshow("result", image)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

face_detect_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第13张图片

import cv2 as cv
import numpy as np

def face_detect_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier("D:/opencv342/data/haarcascades/haarcascade_frontalface_alt_tree.xml")
    #face_detector = cv.CascadeClassifier("D:/opencv342/data/lbpcascades/lbpcascade_frontalcatface.xml")
    #下载地址:https://github.com/opencv/opencv
    faces = face_detector.detectMultiScale(gray, 1.1, 2)
    for x, y, w, h in faces:
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
    cv.imshow("result", image)


print("--------- Python OpenCV Tutorial ---------")
cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
capture = cv.VideoCapture(0)

while(True):
    ret, frame = capture.read()
    frame = cv.flip(frame, 1)#左右变换
    face_detect_demo(frame)
    c = cv.waitKey(10)
    if c == 27: # ESC
        break

cv.waitKey(0)
cv.destroyAllWindows()

Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第14张图片

30 案例—数字验证码识别

import cv2 as cv
import numpy as np
from PIL import Image
import pytesseract as tess

#pip install opencv-python
#pip intsall opencv-contrib-python
#pip install pytesseract

# https://blog.csdn.net/duanshao/article/details/79514051
# https://blog.csdn.net/wang_hugh/article/details/80760940

def recognize_text():
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, open_out = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary-image", open_out)

    cv.bitwise_not(open_out, open_out)
    textImage = Image.fromarray(open_out)
    text = tess.image_to_string(textImage)

    print("识别结果: %s"%text)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/74162.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
recognize_text()
cv.waitKey(0)

cv.destroyAllWindows()

--------- Python OpenCV Tutorial ---------
识别结果: 74162
在这里插入图片描述

import cv2 as cv
import numpy as np
from PIL import Image
import pytesseract as tess

#pip install opencv-python
#pip intsall opencv-contrib-python
#pip install pytesseract

# https://blog.csdn.net/duanshao/article/details/79514051
# https://blog.csdn.net/wang_hugh/article/details/80760940

def recognize_text():
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, open_out = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    cv.imshow("binary-image", open_out)

    cv.bitwise_not(open_out, open_out)
    textImage = Image.fromarray(open_out)
    text = tess.image_to_string(textImage)

    print("识别结果: %s"%text)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/yzm1.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
recognize_text()
cv.waitKey(0)

cv.destroyAllWindows()

--------- Python OpenCV Tutorial ---------
识别结果: KD Q U
Python+OpenCV3.3图像处理视频教程 贾志刚 代码笔记3_第15张图片

import cv2 as cv
import numpy as np
from PIL import Image
import pytesseract as tess

#pip install opencv-python
#pip intsall opencv-contrib-python
#pip install pytesseract

# https://blog.csdn.net/duanshao/article/details/79514051
# https://blog.csdn.net/wang_hugh/article/details/80760940

def recognize_text():
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    #cv.imshow("bin", binary)

    kernel = cv.getStructuringElement(cv.MORPH_RECT, (1,2))
    bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
    #cv.imshow("bin1", bin1)
    kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (2,1))
    open_out = cv.morphologyEx(bin1, cv.MORPH_OPEN, kernel1)
    cv.imshow("binary", open_out)

    cv.bitwise_not(open_out, open_out)
    textImage = Image.fromarray(open_out)
    text = tess.image_to_string(textImage)

    print("识别结果: %s"%text)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/8a62n1.png")
#src = cv.imread("D:/vcprojects/images/e3fy.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
recognize_text()
cv.waitKey(0)

cv.destroyAllWindows()

--------- Python OpenCV Tutorial ---------
识别结果: &AG2NL
在这里插入图片描述

你可能感兴趣的:(opencv,python,贾志刚)