我试图从网络摄像头的灰度实时显示直方图,问题是直方图没有更新,我的凸轮停止直到我关闭直方图的窗口。我怎样才能解决这个问题?我想在同一时间从我的网络摄像头及其直方图中显示灰度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()
答案 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()