如何使用" cv2.createTrackbar()"功能调整流视频帧的大小?

时间:2015-05-14 11:31:09

标签: python-2.7 opencv computer-vision

我是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

2 个答案:

答案 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 valcount。因此,您的代码中包含j = 0j = 1value是跟踪栏的初始值。因此,在您的情况下,它始终为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;
    }
}