2017-11-04 9 views
1

비디오의 오브젝트를 색상으로 추적하려고합니다. 나는이 코드를 단순화 할 수 있습니다 :파이썬에서 for-loop의 이미지 마스킹을 논리적 인덱싱으로 대체하려면 어떻게해야합니까?

while True: 
    ret, frame = cap.read() 
    if not ret: 
     break 
    height, width, channel = frame.shape 
    hue = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV) 
    for i in range(width): 
     for j in range(height): 
      if (hue[j, i, 0] < 110 or hue[j, i, 0] > 140): 
       hue[j, i, 0] = 0 
       hue[j, i, 1] = 0 
       hue[j, i, 2] = 0 
+1

[논리적 색인 생성에 대한 numpy 문서] (https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html)가 대답하지 않은 것은 무엇입니까? 그곳에서 예제들을 시험해 보시고, 그것들과 혼란스러운 점이 있다면 명시 적으로 그것들을 게시하십시오. –

+0

어쨌든'색조 [(색조 <110) | (색조> 140)] = 0'이 당신이 찾고있는 것입니다. 편집 : 실제로 아래의 솔루션은 당신이 첫 번째 채널을 기반으로 만 마스킹했다는 사실에 주목합니다. 나는 그걸 놓쳤습니다 --- 그걸로 가십시오. –

+0

@AlexanderReynolds OP는 '색조'의 첫 번째 채널을 따라 색인을 생성합니다. 그래서 우리는'hue [..., 0]'을 필요로합니다. – Divakar

답변

0

지금처럼 masking에 대한-루프 두 개의 중첩을 제거하기를 -

(hue[...,0] < 110) | (hue[...,0] >140)로 만든 마스크가 같은 모양이 될 것이기 때문에이 작동
hue[(hue[...,0] < 110) | (hue[...,0] >140)] = 0 

첫 번째 두 dimch는 hue이고 그 값은 hue으로 마스킹하기 위해 사용됩니다.이 마스킹은 첫 번째 두 개의 희미한 부분을 따라 색인화되고 마지막 축을 따라 모든 요소에 적용됩니다. 이것은 3 단계 할당의 작업을 수행합니다 : hue[j, i, 0] = 0; hue[j, i, 1] = 0; hue[j, i, 2] = 0; 한 번에.

+0

고마워요. 문서를 훑어 보았습니다.하지만 파이썬을 처음 접했을 때 너무 압도적이었습니다. –