我试图在wxPython中用Python接口显示OpenCV。 我可以显示它,但只能在视频左上角的一个小区域。 我的代码有什么问题? 是父面板的大小还是其他什么? 注意,我使用的代码来自这个https://stackoverflow.com/a/14818080/2389238 它可以完美运行,但我需要在面板(或其他父框架)中显示它。在
提前谢谢。在
import wx
import cv, cv2
class MainWindow(wx.Panel):
def __init__(self, parent,capture):
wx.Panel.__init__(self, parent)
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.inputBox = wx.TextCtrl(self)
mainSizer.Add(self.inputBox, 0, wx.ALL, 5)
# video
videoWarper = wx.StaticBox(self, label="Video",size=(640,480))
videoBoxSizer = wx.StaticBoxSizer(videoWarper, wx.VERTICAL)
videoFrame = wx.Panel(self, -1,size=(640,480))
cap = ShowCapture(videoFrame, capture)
videoBoxSizer.Add(videoFrame,0)
mainSizer.Add(videoBoxSizer,0)
parent.Centre()
self.Show()
self.SetSizerAndFit(mainSizer)
class ShowCapture(wx.Panel):
def __init__(self, parent, capture, fps=24):
wx.Panel.__init__(self, parent)
self.capture = capture
ret, frame = self.capture.read()
height, width = frame.shape[:2]
parent.SetSize((width, height))
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.bmp = wx.BitmapFromBuffer(width, height, frame)
self.timer = wx.Timer(self)
self.timer.Start(1000./fps)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_TIMER, self.NextFrame)
def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self)
dc.DrawBitmap(self.bmp, 0, 0)
def NextFrame(self, event):
ret, frame = self.capture.read()
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.bmp.CopyFromBuffer(frame)
self.Refresh()
capture = cv2.VideoCapture(0)
app = wx.App(False)
frame = wx.Frame(None,-1,'HGA Count',size=(400, 400))
panel = MainWindow(frame,capture)
frame.Show()
app.MainLoop()
这是图像:http://i58.tinypic.com/2u5t7kh.png 抱歉的链接,我不能把图片放在这里,因为声誉低。在
基本上,没有什么可以将您的}本身,这也将成为最小窗口大小。在
ShowCapture
窗口大小设置为所需的大小,因此它仍然停留在某个默认大小。最简单的解决方案可能是完全不使用videoFrame
,因为它似乎不需要,只需使用所需的初始大小创建{问题更新后跟进:
wxVERTICAL
框大小,水平表示。。。你猜到了)或者wxEXPAND
标志,如果你想让它朝另一个方向发展。或者两者兼而有之,当然,如果你想让它向两个方向发展。在videoFrame
不是必需的,事实上,如果您使用3.0以获得最佳效果,您应该将您的视频窗口设为videoWarper
的子级:从3.0开始,wxStaticBoxSizer
的内容应该以其wxStaticBox
作为父级来创建。在感谢VZ发布的答案
现在我明白我的问题了。 小区域是由
wx.Panel
的默认大小引起的,ShowCapture
是继承的。 这使得dc = wx.BufferedPaintDC(self)
中的dc
只有20px*20px, 所以self.bmp
,即640px*480px,只在小区域绘制,超过20px*20px的所有内容都被忽略。在解决方案是将panel
__init__
参数更改为请注意:
我不知道是否可以配置为自动调整面板大小
仍然需要
videoFrame
,因为ShowCapture
需要父框架(用于sizer中的布局)。不知道有没有更好的办法。我想到的是,它使用}。我使用
GenStaticBitmap
,它是wx.Panel
的一个子类,并在其OnPaint
方法中使用{SpinCtrl
添加了ROI选择,还将鼠标悬停在右侧的ROIGenStaticBitmap
控件上。我还添加了一个按钮,当右键单击时保存两个图像,但当左键单击时冻结当前图像并允许用户保存其中一个图像或两个图像。画悬停和投资回报率选择十字线是有趣的,希望它能帮助别人!在相关问题 更多 >
编程相关推荐