【问题标题】:how to use "cv2.createTrackbar()" function to resize the streaming video frame?如何使用“cv2.createTrackbar()”函数来调整流视频帧的大小?
【发布时间】:2015-05-14 11:31:09
【问题描述】:

我是opencv的热心学习者,写了一段用opencv进行视频流的代码我想学习使用cv2.createTrackbar()来添加一些交互功能。虽然,我尝试了这个功能,但它对我不起作用:

对于流式传输和调整帧大小,我使用此代码

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

但此代码无法正常工作并最终出现以下错误:

me@ubuntu:~/Desktop/final_video_soft$ python GUI_STREAM.py p.3gp
Traceback (most recent call last):
  File "GUI_STREAM.py", line 20, in <module>
    frame = scipy.misc.imresize(frame, j)
  File "/usr/lib/python2.7/dist-packages/scipy/misc/pilutil.py", line 365, in imresize
    imnew = im.resize(size, resample=func[interp])
  File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1305, in resize
    im = self.im.resize(size, resample)
TypeError: must be 2-item sequence, not float

【问题讨论】:

  • “不工作”是什么意思?它是否显示错误?它是否给出了您不期望的输出?请更具体。
  • 你能打印并显示j的值吗?
  • @a-Jays 是的,我之前检查过它为 j 打印“-1”。
  • 它不应该是-1。在循环之前使用setTrackBarPos() 将其设置为1。这能解决问题吗?
  • @a-Jays 我已经尝试过了,但发生了同样的错误

标签: python-2.7 opencv computer-vision


【解决方案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' 实际上是 trackbar 名称

此外,如果您阅读过文档,您会知道createTrackbar 将只接受int 作为valcount。因此,您的代码中要么有j = 0 要么有j = 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

【讨论】:

    【解决方案2】:

    对不起,我对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;
        }
    }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!您能否请edit 解释为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
    猜你喜欢
    • 2021-07-25
    • 2015-07-03
    • 2020-03-12
    • 2016-07-08
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多