contente
Introdução ao cv2.getPerspectiveTransforms
Introdução ao cv2.warpPerspective
Código completo e efeito de execução
introdução básica
Nota: A premissa deste artigo é ter aprendido a transformação afim de imagem
Usando a transformação de perspectiva do opencv nos permite extrair de forma simples a informação desejada. Só precisamos conhecer os 4 pontos da imagem original. Através desses 4 pontos e as coordenadas da imagem que queremos gerar, podemos calcular a matriz M, e então pass cv. O método warpPerspective pode extrair a imagem.
Vamos dar uma olhada no efeito primeiro e depois usar essa tecnologia para extrair o livro na imagem
Introdução ao cv2.getPerspectiveTransforms
Acima sabemos que precisamos usar as coordenadas nas 4 imagens originais e as coordenadas da imagem recém-gerada para obter a matriz M por operação. É muito trabalhoso calcular à mão. Usamos a função fornecida pelo opencv para completá-la . Esta função retorna a matriz M
def getPerspectiveTransform(src, dst, solveMethod=None)
- src: coordenadas de 4 pontos na imagem original
- dst: coordenadas de 4 pontos da imagem gerada
- solveMethod: método de decomposição de matrizes, passado para cv2.solve(DecompTypes) para resolver equações lineares ou resolver problemas de mínimos quadrados, o valor padrão é None, o que significa que DECOMP_LU é usado. Para detalhes, consulte o site oficial
Um diagrama esquemático é dado abaixo.
Introdução ao cv2.warpPerspective
Este método é muito semelhante ao warpPerspective e é explicado abaixo
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
- src: imagem de entrada
- M: Matriz de operação
- dsize: O tamanho da matriz após a operação, ou seja, o tamanho da imagem de saída
- dst: imagem de saída
- flags: uma combinação de métodos de interpolação, o mesmo que a interpolação na função resize, você pode visualizar cv2.resize
- borderMode: método de extrapolação de pixel, consulte o site oficial para obter detalhes
- borderValue: valor borderValue a ser usado em caso de borda constante; por padrão é 0
Encontrar imagens de recursos
Faça a saída da imagem através do matplotlib e, em seguida, observe aproximadamente as 4 coordenadas da imagem do recurso
Aqui eu dou 4 coordenadas de superior esquerdo, superior direito, inferior esquerdo e inferior direito por observação, (190, 240), (505, 160), (360, 670), (768, 490)
src = np.float32([[190, 240], [505, 160], [360, 670], [768, 490]])
Obtemos as 4 coordenadas da imagem de feição e, em seguida, damos as 4 coordenadas da imagem recém-gerada. O que eu quero gerar é uma imagem com uma altura de 640 e uma largura de 480, então o recém-gerado superior esquerdo, superior direito , inferior esquerdo, inferior direito 4 coordenadas são (0, 0), (480, 0), (0, 640), (480, 640)
dst = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])
Código completo e efeito de execução
import cv2
import numpy as np
img = cv2.imread('../images/book.jpg')
# 设置特征图像和生成图像的坐标
src = np.float32([[190, 240], [505, 160], [360, 670], [768, 490]])
dst = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])
# 通过运算得出M矩阵
M = cv2.getPerspectiveTransform(src, dst)
# 提取特征图片
book = cv2.warpPerspective(img, M, (480, 640))
cv2.imshow('img', cv2.resize(img, (480, 640)))
cv2.imshow('book', book)
cv2.waitKey(0)
cv2.destroyAllWindows()