Python: объединение каналов в opencv и вручную - PullRequest
0 голосов
/ 23 сентября 2018
def frame_processing(frame):
out_frame = np.zeros((frame.shape[0],frame.shape[1],4),dtype = np.uint8)
b,g,r = cv2.split(frame)
alpha = np.zeros_like(b , dtype=np.uint8)
print(out_frame.shape)
print(b.shape);print(g.shape);print(r.shape);print(alpha.shape)
for i in range(frame.shape[0]):
    for j in range(frame.shape[1]):
        a = (frame[i,j,0],frame[i,j,1],frame[i,j,2])
        b = (225,225,225)
        if all(i > j for i, j in zip(a,b)):  #all(a>b) :
            alpha[i,j] = 0
        else:
            alpha[i,j] = 255
out_frame[:,:,0] = b
out_frame[:,:,1] = g
out_frame[:,:,2] = r
out_frame[:,:,3] = alpha
#out_frame = cv2.merge((b,g,r,alpha))
return out_frame

Хотел добавить альфа-канал;пробовал cv2.Merge() и ручная укладка каналов, но не удалось.

При использовании cv2.merge():

error: OpenCV(3.4.2) C:\projects\opencv- 
python\opencv\modules\core\src\merge.cpp:458: error: (-215:Assertion failed) 
mv[i].size == mv[0].size && mv[i].depth() == depth in function 'cv::merge'

При добавлении каналов вручную:

ValueError: could not broadcast input array from shape (3) into shape 
(225,225)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Используйте cv2.inRange, чтобы найти маску, затем объедините их с np.dstack:

#!/use/bin/python3
# 2018/09/24 11:51:31 (CST)
import cv2
import numpy as np

#frame = ...
mask = cv2.inRange(frame, (225,225,225), (255,255,255))

#dst = np.dstack((frame, 255-mask))
dst = np.dstack((frame, mask))

cv2.imwrite("dst.png", dst)

Чтобы найти определенный цвет, возможно, вас заинтересует этот вопрос:

Выбор правильной верхней и нижней границ ВПГ для определения цвета с помощью `cv :: inRange` (OpenCV)

0 голосов
/ 23 сентября 2018

Это простая опечатка.Вы изменяете переменную "b" в цикле for, и она конфликтует с переменной синего канала.Изменение b = (225,225,225) на threshold = (225, 255, 255) и zip(a,b) на zip(a, threshold) должно решить проблему.
Кстати, вы можете использовать это для создания своего альфа-канала:

alpha = np.zeros(b.shape, dtype=b.dtype)

Также вы можетеЗаполните ваш альфа-канал, как это, если вам нужно больше скорости (вы можете измерить разницу во времени):

alpha[~((b[:,:]>threshold[0]) & (g[:,:]>threshold[1]) & (r[:,:]>threshold[2]))] = 255

Таким образом, ваша функция становится:

def frame_processing(frame):
    #  split channels
    b,g,r = cv2.split(frame)

    #  initialize alpha to zeros
    alpha = np.zeros(b.shape, dtype=b.dtype)

    #  fill alpha values
    threshold = (225, 225, 225)
    alpha[~((b[:,:]>threshold[0]) & (g[:,:]>threshold[1]) & (r[:,:]>threshold[2]))] = 255

    #  merge all channels back
    out_frame = cv2.merge((b, g, r, alpha))

    return out_frame
...