我是opencv的热心学习者并使用opencv写下视频流代码我想学习使用cv2.createTrackbar()来添加一些交互功能。虽然,我试过这个功能,但它不适合我:
对于流式传输和调整帧大小,我使用此代码
<div class="progress" id="progress">
<span class="color" id="audionamloaded">Name Of Song</span>
</div>
然后我已经像这样转换了上面的代码来添加轨迹栏功能来调整框架的大小。
import cv2
import sys
import scipy.misc
import scipy
cap = cv2.VideoCapture(sys.argv[1])
new_size = 0.7 # value range(0,1) can be used for resizing the frame size
while(1):
ret, frame = cap.read()
frame = scipy.misc.imresize(frame, new_size)
cv2.imshow("t",frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
但是这段代码不能正常工作,最后给出了这个错误:
import cv2
import sys
import scipy.misc
import scipy
def nothing(x):
pass
cv2.createTrackbar('t','frame',0,1,nothing)
cap = cv2.VideoCapture(sys.argv[1])
while(1):
ret, frame = cap.read()
j = cv2.getTrackbarPos('t','frame')
frame = scipy.misc.imresize(frame, j)
cv2.imshow("t",frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
答案 0 :(得分:1)
您的代码肯定会失败。有太多问题表明您没有阅读该文档。即使是第一个new_size
,肯定会失败。
cap = cv2.VideoCapture(sys.argv[1])
这是错误的。因为它需要int
而不是str
。你必须cap = cv2.VideoCapture(int(sys.argv[1]))
另一个明显的错误是您在以下代码中提供的冲突窗口名称:
cv2.createTrackbar('t','frame',0,1,nothing)
cv2.imshow("t",frame)
imshow
使用窗口名称't'。但't'实际上是轨道栏名称。
此外,如果您已阅读该文档,则会知道createTrackbar
仅接受int
val
和count
。因此,您的代码中包含j = 0
或j = 1
。 value
是跟踪栏的初始值。因此,在您的情况下,它始终为0,这将在imshow中引发错误。
getTrackbarPos
应该在事件触发的回调中,不在主循环中。如果您按照发布的方式执行此操作,它可能仍会运行,但它不会响应每个滑动事件。但是,由于视频捕获循环非常快,因此不会造成明显的麻烦。
修复所有这些错误之后,它最终会像这样:
scale = 700
max_scale = 1000
def modified():
scale = 500
_scale = float(scale)/max_scale
cv2.namedWindow('frame', cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar('t','frame', scale, max_scale, nothing)
cap = cv2.VideoCapture(int(sys.argv[1]))
while(1):
ret, frame = cap.read()
if not ret:
break
scale = cv2.getTrackbarPos('t','frame')
if scale > 1:
_scale = float(scale)/max_scale
print "scale = ", _scale
frame = scipy.misc.imresize(frame, _scale)
cv2.imshow("frame",frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
答案 1 :(得分:0)
抱歉,我熟悉c ++,这是C ++代码,希望它有所帮助。 下面提到的代码使用createTrackbar函数
为摄像机的实时视频流添加了对比度调整#include "opencv2\highgui.hpp"
#include "opencv2\core.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv[])
{
string owin = "Live Feed Original";
string mwin = "Modified Live stream";
int trackval = 50;
Mat oframe;
Mat inframe;
VideoCapture video(0);
if (!video.isOpened())
{
cout << "The Camera cannot be accessed" << endl;
return -1;
}
namedWindow(owin);
moveWindow(owin, 0, 0);
namedWindow(mwin);
createTrackbar("Contrast", mwin, &trackval, 100);
while (1)
{
video >> inframe;
imshow(owin, inframe);
inframe.convertTo(oframe, -1, trackval / 50.0);
imshow(mwin, oframe);
if (waitKey(33) == 27)
break;
}
}