我的摄像头的实时直方图

时间:2016-07-28 12:34:10

标签: python opencv histogram

我试图从网络摄像头的灰度实时显示直方图,问题是直方图没有更新,我的凸轮停止直到我关闭直方图的窗口。我怎样才能解决这个问题?我想在同一时间从我的网络摄像头及其直方图中显示灰度img,有可能吗?

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

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Janela', frame)
    cv2.imshow('Outra', gray)
    plt.hist(gray.ravel(), 256, [0, 256])
    plt.show()

    if (cv2.waitKey(1) & 0xFF == 27):
        break

cap.release()
cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:3)

我在同一个任务中工作了一段时间。过了一段时间,我有一段非常好的代码。它在窗口中显示摄像机图像,在其他窗口中显示直方图。由于我有兴趣寻找颜色,我正在使用每个帧的“色调”通道。

# import the necessary packages
import cv2
import numpy as np

#Create window to display image
cv2.namedWindow('colorhist', cv2.CV_WINDOW_AUTOSIZE)

#Set hist parameters
hist_height = 64
hist_width = 256
nbins = 32
bin_width = hist_width/nbins

camera_id = 0 # type fo webcam [0 built-in | 1 external]
cameraWidth = 320
cameraHeight = 240

if camera_id == 0:
   cameraId = "PC webcam"
elif camera_id == 1:
   cameraId = "External webcam"

camera = cv2.VideoCapture(camera_id)

# set camera image to 320 x 240 pixels
camera.set(3,cameraWidth)
camera.set(4,cameraHeight)

cameraInfo = "Image size (%d,%d)" % (camera.get(3),camera.get(4))

# initialize mask matrix
mask = np.zeros((cameraHeight,cameraWidth),  np.uint8)

# draw a circle in mask matrix
cv2.circle(mask,(cameraWidth/2,cameraHeight/2), 50, 255, -1)

#Create an empty image for the histogram
h = np.zeros((hist_height,hist_width))

#Create array for the bins
bins = np.arange(nbins,dtype=np.int32).reshape(nbins,1)

while True:
   # grab the current frame 
   (grabbed, frame) = camera.read()

   if not grabbed:
      "Camera could not be started."
      break

   hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   #Calculate and normalise the histogram
   hist_hue = cv2.calcHist([hsv],[0],mask,[nbins],[0,256])
   cv2.normalize(hist_hue,hist_hue,hist_height,cv2.NORM_MINMAX)
   hist=np.int32(np.around(hist_hue))
   pts = np.column_stack((bins,hist))

   #Loop through each bin and plot the rectangle in white
   for x,y in enumerate(hist):
      cv2.rectangle(h,(x*bin_width,y),(x*bin_width + bin_width-1,hist_height),(255),-1)

   #Flip upside down
   h=np.flipud(h)

   #Show the histogram
   cv2.imshow('Color Histogram',h)
   h = np.zeros((hist_height,hist_width))

   frame = cv2.bitwise_and(frame,frame,mask = mask)
   cv2.putText(frame, cameraInfo, (10, 20),
    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

   cv2.imshow(cameraId, frame)            
   key = cv2.waitKey(1) & 0xFF

   # if the `q` key is pressed, break from the loop
   if key == ord("q"):
      break

camera.release()
cv2.destroyAllWindows()

代码基于JohnLinux(How do I plot a 32-Bin Histogram for a Grayscale Image in Python using OpenCV)的代码,其他代码行来自我从Adrian Rosenbrock的网站https://www.pyimagesearch.com/学到的知识。

答案 1 :(得分:0)

我发现有关此主题的反馈很少。一些解决方案看起来极其复杂。我哥哥只需要一个简单版本的程序来学习,所以我决定尽可能简单地编写它(11 行代码 - 享受:))

import cv2 as cv
from matplotlib import pyplot as plt

vid = cv.VideoCapture(0, cv.CAP_DSHOW)
while True:
    ret, img = vid.read()
    cv.imshow("img", img)
    plt.hist(img.ravel(), 256, [0, 256])
    plt.draw()
    plt.pause(0.1)
    plt.clf()
cv.destroyAllWindows()