2013-05-31 3 views
2

Я пытаюсь применить метод numpy palette к обработанному opencv видео (ссылки: this question и this tutorial). Я нацелен на замену всех пикселей кадра определенного диапазона цветов другим. Ниже приведен код, который заменяет черный цвет зеленым. Unfotunately, мой код выдает ошибку на линии:Метод палитры с использованием numpy

image[np.where((image==[0,0,0]).all(axis=2))]=green 

ошибки: exceptions.ValueError: ось (= 2) из ​​границ

Я бег питона 2.7 с PyScripter, и я нахожу это странным, потому что код действительно работал раньше, и я не делал никаких серьезных изменений. Может кто-нибудь, пожалуйста, помогите мне? Я совсем застрял на этом ...

Мой код:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

##IMPORTS 
import cv2.cv as cv 
import numpy as np 
import time 

##VARIABLES 
#colors 
green=[0,255,0] 

##MAIN 
#video file input 
frames = raw_input('Please input video file:') 
if not frames: 
    print "This program requires a file as input!" 
    sys.exit(1) 

#create window 
cv.NamedWindow("image", 1) 

#File capture 
vidFile = cv.CaptureFromFile(frames) 
nFrames = int( cv.GetCaptureProperty(vidFile, cv.CV_CAP_PROP_FRAME_COUNT)) 
fps = cv.GetCaptureProperty(vidFile, cv.CV_CAP_PROP_FPS) 
waitPerFrameInMillisec = int(1/fps * 1000/1) 

#time adjustment, frame capture 
for f in xrange(nFrames): 
    frame = cv.QueryFrame(vidFile) 

    # create the images we need 
    image = cv.CreateImage (cv.GetSize (frame), 8, 3) 

    # copy the frame, so we can draw on it 
    if not frame: 
     break 
    else: 
     cv.Copy (frame, image) 

    #get pixel HSV colors 
    rows,cols=cv.GetSize(frame) 
    image=np.asarray(image) 
    image[np.where((image==[0,0,0]).all(axis=2))]=green 
    image=cv.fromarray(image) 

    #show the image 
    cv.ShowImage("image", image) 

    #quit command ESC 
    if cv.WaitKey(waitPerFrameInMillisec)==27: 
     break 
    else: 
     cv.WaitKey(waitPerFrameInMillisec) % 0x100 
+0

Казалось бы, ваше изображение имеет размеры менее 3. Добавьте строку 'print image.shape' перед строкой, поднимающей ошибку. Я не уверен в cv, но я знаю, что при преобразовании изображений в массивы numpy с PIL возврат является массивом 1D. Возможно, вам потребуется заменить текущую строку на «image = np.asarray (image) .reshape (rows, cols, -1)». – Jaime

ответ

1

я решил. Фактически, ответ не был модификацией строки, поднимающей исключение, а скорее изменением аргументов, которые были переданы этой строке. Действительно, кажется, что аргументы '[:,:]' необходимы в opencv при преобразовании cvMat в Numpy и обратно. Вот скорректированный код:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

##IMPORTS 
import cv2.cv as cv 
import numpy as np 

##VARIABLES 
#colors 
green=[0,255,0] 

##MAIN 
#start video stream analysis 
frames = raw_input('Please enter video file:') 
if not frames: 
    print "This program requires a file as input!" 
    sys.exit(1) 


# first, create the necessary windows 
cv.NamedWindow ('image', cv.CV_WINDOW_AUTOSIZE) 


#File capture 
vidFile = cv.CaptureFromFile(frames) 
nFrames = int( cv.GetCaptureProperty(vidFile, cv.CV_CAP_PROP_FRAME_COUNT)) 
fps = cv.GetCaptureProperty(vidFile, cv.CV_CAP_PROP_FPS) 
waitPerFrameInMillisec = int(1/fps * 1000/1) 


for f in xrange(nFrames): 
    #time adjustment, frame capture 
    sec = f/fps 
    frame = cv.QueryFrame(vidFile) 

    # create the images we need 
    image = cv.CreateImage (cv.GetSize (frame), 8, 3) 


    # copy the frame, so we can draw on it 
    if not frame: 
     break 
    else: 
     cv.Copy (frame, image) 

    #Replace pixel colors 
    rows,cols=cv.GetSize(frame) 
    image=np.asarray(image[:,:]) 
    image[np.where((image==[0,0,0]).all(axis=2))]=green 
    image=cv.fromarray(image[:,:]) 

    #show the image 
    cv.ShowImage("image", image) 

    #quit command ESC 
    if cv.WaitKey(waitPerFrameInMillisec)==27: 
     break 
    else: 
     cv.WaitKey(waitPerFrameInMillisec) % 0x100 

cv.DestroyAllWindows() 
Смежные вопросы