Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问Ximea camera并使用OpenCV设置预定义的分辨率会显示令人困惑的输出,这是由于摄像头的尺寸太大’;s默认分辨率_C++_Opencv_Camera_Resolution_Ximea - Fatal编程技术网

C++ 访问Ximea camera并使用OpenCV设置预定义的分辨率会显示令人困惑的输出,这是由于摄像头的尺寸太大’;s默认分辨率

C++ 访问Ximea camera并使用OpenCV设置预定义的分辨率会显示令人困惑的输出,这是由于摄像头的尺寸太大’;s默认分辨率,c++,opencv,camera,resolution,ximea,C++,Opencv,Camera,Resolution,Ximea,问题描述: 通过简单的代码,我可以访问我的内部摄像头网络摄像头,也可以更改分辨率。因此,显示具有默认分辨率和预定义分辨率的帧(例如,从640x480到320x240,使用cap.set(CV_cap_PROP_frame_WIDTH,320)和frame_HEIGHT,240)都可以正常工作 使用相同的代码,稍加调整,使其与Ximea相机(VideoCapture cap(CV_cap_XIAPI))配合使用,可用于默认分辨率。 它是一个默认分辨率为2592x1944的MU9PC_MH,因此64

问题描述:

通过简单的代码,我可以访问我的内部摄像头网络摄像头,也可以更改分辨率。因此,显示具有默认分辨率和预定义分辨率的帧(例如,从640x480到320x240,使用cap.set(CV_cap_PROP_frame_WIDTH,320)和frame_HEIGHT,240)都可以正常工作

使用相同的代码,稍加调整,使其与Ximea相机(VideoCapture cap(CV_cap_XIAPI))配合使用,可用于默认分辨率。 它是一个默认分辨率为2592x1944的MU9PC_MH,因此648 x486是所需的较低分辨率

对于手动设置的分辨率,显示的窗口/抓取的帧具有默认分辨率(2592x1944)的大小,并在这个巨大的显示器中显示捕获的较低像素量,因此上五分之一充满困惑的像素,其余窗口为黑色

这两种情况都发生在C++和视频捕获和MAT上,对于C CVCAPTCOFFROM和IPLIMAGE *.p> 当我使用设置标志CV_CAP_PROP_XI_DOWNSAMPLING时,我可以看到像素顺序正确的输出图像,但显示帧仍具有默认的高分辨率,并且输出图像会显示多次(该因子取决于我用于下采样的因子)

我甚至无法将Mat或IplImage强制为预定义的大小,因为随后会发生断言错误或访问冲突(Mat image(XRES,YRES,CV_8UC3,Scalar(0,0255))(frame=cvCreateImage(cvSize(XRES,YRES),IPL_DEPTH_8U,3))。我已通过frame.type()检查了输出是否为CV_8UC3

我想要的是648x486的Ximea摄像头输出,显示在(理想情况下)相同大小的垫子中。 有没有人遇到过同样的问题? 可能是因为我对工业摄像头的配置/开发缺乏了解,但我们非常感谢您的帮助

情况: Windows 7(x64) Visual Studio专业版2012 为x86编译的OpenCV版本2.4.10已选中以下标志:使用_XIMEA和_OPENGL x86中的简单VS2012项目(包括发行版和调试版),用于在窗口中进行摄影机流式传输和摄影机帧显示

简单的代码片段(不是我的,是从opencv教程和ximea复制的): C++风格:
#包括“opencv2/core/core.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
使用名称空间cv;
使用名称空间std;
int main(int argc,字符**argv){
VideoCapture cap(0);//打开默认摄像机
//视频捕捉帽(CV_cap_XIAPI);
if(!cap.isopend())//检查我们是否成功
返回-1;
cout返回一个bool以指示方法的成功。如果不检查此调用的成功/失败并在必要时重新调整捕获的大小,则不应让应用程序继续运行

事实上,一些相机驱动程序不接受任意尺寸,您对此无能为力。但是,您可以使用默认尺寸检索帧,然后根据需要进行调整


这并不理想,但可以完成工作。

谢谢karlphillip的回答。不幸的是,你是对的,这不是一个理想的方法。因此,我利用昨天的雪地天气,自己找到了解决方案:
cap\u ximea.cpp
resetCvImage()
方法中有错误

第207行如果((int)image.width!=宽度| |(int)image.height!=高度 ||image.frm!=(XI\u IMG\u格式)格式)

必须是:

if( (int)image.width != **frame->**width || (int)image.height != **frame->**height || image.frm != (XI_IMG_FORMAT)format)

是的,没错。还尝试了cap.set(CV_cap_PROP_XI_DOWNSAMPLING,2),以便分辨率仅减半(=1296972),cap.set(CV_cap_PROP_FRAME_WIDTH,648),等等-只是为了确保它工作。方法中的更改会影响最初创建的Ipimage,它具有相机的默认大小(=2592x1944)还获取已更改属性的更新。