2017-04-02 38 views
1

我做了该程序必须遵循常规的练习:当在视频中的任意点的用户点击,它得到的是像素和打开的所有像素的范围为5%到红色。由于它是一个视频,我保存了用户在列表中单击的点(x,y),并为每个点进行了调整。这里是代码:import numpy的为NP进口CV2图中的视频

import numpy as np 
import cv2 


cap =cv2.VideoCapture(-1) 

#creates list 


lista= [] 

    #mouse callback function 

def getpixel(event,x,y,flags,param): 

     #adds point (x,y) in pixels ont the current list 

if event == cv2.EVENT_LBUTTONDOWN: 
    lista.append([x,y]) 
    print (x,y),img[x][y] 


    while(cap.isOpened()): 

ret,img= cap.read() 
if ret: 
    cv2.imshow('image',img) 
    cv2.setMouseCallback('image',getpixel) 
i=0 
#draw the retangle 
while i<lista.__len__(): 
     img[int(0.95*lista[i][0]):int(1.05*lista[i][0]),int(0.95*lista[i][1]):int(1.05*lista[i][1])]=(0,0,255) 
     i+=1 
if cv2.waitKey(20) & 0xFF == 27: 
    break 

    cap.release() 

    cv2.destroyAllWindows() 

我已经检查,它是创建列表,添加点并输入代码的“而”部分。但是,我看不到纠结。我错过了什么?

回答

1

:快速修复读取底部这个答案。

在你的代码计算百分比不是长得更高了拍摄画面的width/hight但是从点自己

img[int(0.95*lista[i][0]):int(1.05*lista[i][0]), .... 

所以,你需要获得widthhight - 这是作为

width = cap.get(CAP_PROP_FRAME_WIDTH) 
height = cap.get(CAP_PROP_FRAME_HEIGHT) 

,然后你的矩形的顶点调整这些值:

int(lista[i][0] - 0.95 * width) 
int(lista[i][0] + 1.05 * width) 
int(lista[i][1] - 0.95 * hight) 
int(lista[i][1] + 1.95 * hight) 

要具体,更优雅:

而不是你的代码

i=0 
#draw the retangle 
while i<lista.__len__(): 
    img[int(0.95*lista[i][0]):int(1.05*lista[i][0]),int(0.95*lista[i][1]):int(1.05*lista[i][1])]=(0,0,255) 
    i+=1 

写这个的这部分:

width = cap.get(CAP_PROP_FRAME_WIDTH) 
height = cap.get(CAP_PROP_FRAME_HEIGHT) 

deltaX = 0.05 * width 
deltaY = 0.05 * hight 

while point in lista: 
    ltX = int (point[0] - deltaX)  # Left top X coordinate 
    ltY = int (point[1] - deltaY)  # Left top Y coordinate 
    rbX = int (point[0] + deltaX)  # --- and so on --- 
    rbY = int (point[1] + deltaX) 

    img[ltX:rbX, ltY:rbY] = (0,0,255) 
+0

请考虑接受我的答案(点击复选标记)是否对你有用(2名声望)。 – MarianD