我正试图在OpenCV中捕获Logitech C920的视频流.使用Labview,我可以30fps 1080p访问MJPG流.在opencv中,我被限制为5fps或640x480.
以下是与相机设置相关的代码:
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
Run Code Online (Sandbox Code Playgroud)
这些都返回1,但我得到一个5fps的1080p流,对应于YUY2流.
如果我添加以下行:
this->camRef.set(CV_CAP_PROP_FPS, 30);
Run Code Online (Sandbox Code Playgroud)
返回0.我在640x480得到一个30 fps的流.对我而言,似乎不接受MJPG设置,但我不知道该怎么做或如何解决这个问题.
编辑:以下崩溃程序.
this->camRef.read(this->image);
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl;
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
Run Code Online (Sandbox Code Playgroud)
然后在我的运行代码中,我有以下内容:
void camera::run()
{
while(true)
{
if(this->camRef.read(this->image) == 0)
{
if(this->capture)
{
cv::imwrite(fileName,this->image);
this->count++;
}
}
msleep(15);
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:解决方案是在设置摄像机高度和宽度之前设置fourCC编解码器.
我在C#2010中编写了一个小程序,它可以通过制作一系列设备来分割来自不同键盘的输入,部分使用以下内容:
- 此代码适用于非统一键盘 -
InputDevice id;
NumberOfKeyboards = id.EnumerateDevices();
id = new InputDevice( Handle );
id.KeyPressed += new InputDevice.DeviceEventHandler( m_KeyPressed );
private void m_KeyPressed( object sender, InputDevice.KeyControlEventArgs e ) {
lbDescription.Text = e.Keyboard.Name;
// e.Keyboard.* has many useful strings, none work for me anymore.
}
Run Code Online (Sandbox Code Playgroud)
很满意,我跑出去买了4台使用Unifying接收器的Logitech K230键盘.遗憾的是,所有键盘数据现在都是多路复用的,并在我的代码中显示为单个键盘!
如何识别输入来自哪个"统一"键盘?理想情况下在C#中,但我想如果存在解决方案,我愿意查看其他语言.
我在Ubuntu 12.04 64位上使用OpenCV 2.4.5.我希望能够设置Logitech C310网络摄像头的输入分辨率.相机支持最高1280x960(30fps),我可以在guvcview中以此分辨率观看视频.但OpenCV总是以640x480的速度获取视频.
在创建VideoCapture上限后立即尝试使用cap.set(CV_CAP_PROP_FRAME_WIDTH,1280)和cap.set(CV_CAP_PROP_FRAME_HEIGHT,960)更改分辨率无效; 在获取每个帧之前尝试立即设置它们会导致程序立即崩溃.我也不能用这种方法降低分辨率.我也收到错误"HIGHGUI ERROR:V4L/V4L2:VIDIOC_S_CROP".我认为这可能是相关的,因为它在创建VideoCapture时出现一次,并且当我尝试设置宽度和高度时出现一次(但奇怪的是,如果我尝试仅设置其中一个,则不会).
我知道我不是第一个遇到这个问题的人,但我还没有找到一个解决方案,经过谷歌搜索和搜索SO以及互联网上的其他地方(在我已经尝试过的许多事情中,无法获得的答案是这个StackOverflow问题:提高OpenCV中的摄像头捕获分辨率.这是OpenCV中的错误吗?如果是这样,这是一个相当明显的.
以下是展示问题的代码示例(只是OpenCV视频显示代码的修改版本):
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
Mat image;
namedWindow("Video", CV_WINDOW_AUTOSIZE);
while(1)
{
// cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
// cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
cap >> image;
imshow("Video", image);
if(waitKey(10) == 99 ) break;
}
return
}
Run Code Online (Sandbox Code Playgroud)
实际上,如上所述,我得到两个"HIGHGUI ERROR",我得到一个640x480输出.我知道160x120是我的相机支持的分辨率v4l2-ctl --list-formats-ext.如果我取消注释while循环中两个注释掉的行,程序会立即崩溃.
这些可能是相关的或有可能的解决方案:http://answers.opencv.org/question/11427/decreasing-capture-resolution-of-webcam/,http://answers.opencv.org/question/30062/error-设置-分辨率的视频捕获装置/
我正在尝试使用导入OpenCV的python代码从我的网络摄像头获取图像.代码如下:
import sys
sys.path.append("C:\\opencv\\build\\python\\2.7")
import cv2
import cv2.cv as cv
import time
# Set resolution
cap = cv2.VideoCapture(0)
print "Frame default resolution: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
cap.set(cv.CV_CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 600)
print "Frame resolution set to: (" + str(cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)) + "; " + str(cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)) + ")"
# Acquire frame
capture = cv.CreateCameraCapture(0)
img = cv.QueryFrame(capture)
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但相机默认分辨率为640x480,我的代码似乎只能设置低于此值的分辨率值.例如,我可以将图像大小设置为320x240,但我无法将其更改为800x600.我没有出现错误:只需将分辨率设置为默认值(640x480),因为我尝试将其设置为更高的值.
我正在使用的相机(没有其他网络摄像头连接到计算机)是QuickCam V-UBK45:使用Logitech提供的软件,我能够以全分辨率(1280x960)和所有中间分辨率(例如800x600)拍摄照片.
因此,硬件支持这些帧大小,但我的代码无法访问它们.
有谁知道我能做什么?
我买了一台Logitech Marble Trackman.我习惯按住一个按钮并将球滚动到linux下滚动.现在我在Win8下工作并安装了Logitech SetPoint.现在我有Universal Scroll和AutoScroll作为选项,并且都锁定了滚动功能.我需要再次单击以停用滚动.
有没有办法只用按钮4保持滚动?
在之前的OpenCV 2.2中,我能够做到
VideoCapture capture(0);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
Run Code Online (Sandbox Code Playgroud)
为了修改帧大小.但是当我针对OpenCV 2.2编译我的应用程序之后,设置属性不再有效(尽管视频显示正确).如果我得到这些值,则返回0.如果我看一下捕获帧的大小,它是160 x 120.
我在网上搜索,但大多数帖子都是关于Linux中的问题,而我正在运行Windows 7 64位.我的网络摄像头是Logitech QuickCam Ultra Vision.
有没有人遇到同样的问题?还是没问题?
提前致谢!
有没有人有关于如何使用Logitech G19键盘SDK与Visual Studio 2010和C#进行LCD编程的示例,教程或链接?我找不到C#的任何地方.
有没有可以找到有关Logitech Unifying Receiver的文档或SDK的地方?
我最近获得了一个无线鼠标,它带有一个Logitech Unifying Receiver(一个插入计算机并与鼠标/其他兼容设备(如键盘)通信的小型USB加密狗).
我想尝试为我的智能手机编写一个假装是鼠标并将数据发送到接收器的应用程序.
我能够通过使用usbmon来监控来自USB总线的数据,并且可能会使用它来解决问题,但想知道我是否能够在互联网上找到我需要的信息,而不必自己推导出来.
我将尝试在Android上使用SL4A,如果这有帮助的话.
我正在尝试用罗技c920拍摄1500万像素的图像.
该摄像机支持全高清(2.1 MP)视频和15MP静态图像.
使用提供的Logitech软件,我确实可以保存15MP图像.但是如果我通过DirectShow直接访问相机,我最多可以获得全高清分辨率.看起来相机卡在"视频"模式下.
我尝试了各种访问网络摄像头的例子,即RobotEyez,VLC,NirSoft WebCamImageSave.
我开始怀疑Windows下的网络摄像头的默认界面仅用于视频,并且没有官方的方式告诉摄像机拍摄分辨率高于视频流的静态图像.
如何在Windows下访问此类设备以捕获静态图像支持的完整15MP分辨率?
情况如下:
我们设法让相机与OpenCv 2.4.0和Qt 5.0.2一起使用.相机应该能够以30 fps录制1080p视频.
但是,在1920x1080录制时,我们停留在10 fps.
这是我们使用的代码:
Capture cv::VideoCapture;
Capture.open(0);
Capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920):
Capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
Run Code Online (Sandbox Code Playgroud)
我们已经尝试使用这个命令(我们从使用openCV 2.4.3从logitech c920以30fps捕获1080p获得):
Capture.set(CV_CAP_PROP_FOURCC, 'M', 'J', 'P', 'G');
Run Code Online (Sandbox Code Playgroud)
但没有任何成功.
我们相信相机的流可以在h264(由于相机进行内部转换)或mjpg中捕获.
就像我们说的那样,我们有点困惑/失落.
欢迎任何建议!谢谢