Отобразите нижнее изображение линии и обрежьте верхнее изображение с помощью Opencv - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь обрезать живое видео по диагонали.С помощью cv.line я упомянул размеры, и моя цель - показать видео нижней части линии, которую я нарисовал, а верхнее видео должно быть обрезано. Как новичок, я только смог нарисоватьстрока с использованием следующего кода:

import cv2

cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)

if vc.isOpened(): # try to get the first frame
    rval, frame = vc.read()
else:
    rval = False

while rval:
    cv2.imshow("preview", frame)
    rval, frame = vc.read()
    key = cv2.waitKey(20)
    if key == 27: # exit on ESC
        break
    else:
        cv2.line(img=frame, pt1=(700,5), pt2=(5, 450), color=(255, 0, 0), thickness=1, lineType=8, shift=0)

vc.release()
cv2.destroyWindow("preview")

Вывод: enter image description here

Предложение по этому вопросу будет очень полезным

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вот код, который замаскирует точки над линией. Я добавил комментарии здесь, чтобы вы могли следить за тем, что происходит. Есть более быстрые способы сделать это, но я хотел что-то, что было бы легко читаемым.

import cv2
import matplotlib.pyplot as plt
import numpy as np

path = r"path\to\img"

img = cv2.imread(path)

#plt.imshow(img)
#plt.show()
pt1 = (86, 0) #ensure this point exists within the image
pt2 = (0, 101) #ensure this point exists within the image
cv2.line(img, pt1, pt2, (255, 255, 255))

#plt.imshow(img)
#plt.show()
#slope of line
m = float(pt2[1] - pt1[1])/float(pt2[0] - pt1[0])
c = pt1[1] - m*pt1[0]
#create mask image
mask1 = np.zeros(img.shape, np.uint8)
#for every point in the image
for x in np.arange(0, 87):
    for y in np.arange(0, 102):
        #test if point exists above the line, 
        if y > m*x + c:
            mask1[y][x] = (255, 255, 255)


#plt.imshow(mask1)
#plt.show()
fin_img = cv2.merge((img[:, :, 0], img[:, :, 1], img[:, :, 2], mask1[:,:, 0]))
#plt.imshow(fin_img)
#plt.show()

cv2.imwrite('output.png', fin_img)
0 голосов
/ 26 апреля 2019

Для обрезки изображений я использую mask и cv2.bitwise_and().

Исходное изображение:

source image

Маска:

# Create a mask image with a triangle on it
y,x,_ = img.shape
mask = np.zeros((y,x), np.uint8)
triangle_cnt = np.array( [(x,y), (x,0), (0,y)] )
cv2.drawContours(mask, [triangle_cnt], 0, 255, -1)

mask image

Выход:

img = cv2.bitwise_and(img, img, mask=mask)

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...