gpt4 book ai didi

c++ - 访问 Ximea 相机并使用 OpenCV 设置预定义分辨率显示令人困惑的输出,这是由于相机默认分辨率大小的 Mat

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:00 25 4
gpt4 key购买 nike

问题描述:

使用简单的代码,我可以访问我的内置摄像头网络摄像头并更改分辨率。因此,以默认分辨率和预定义分辨率显示帧(例如,从 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) 的大小,并在这个巨大的显示器中显示较低数量的捕获像素,因此上面的五分之一充满了困惑的像素窗口的其余部分是黑色的。

这种效果发生在带有 VideoCapture 和 Mat 的 C++ 以及 CvCaptureFromCAM 和 IplImage* 上。

当我使用设置标志 CV_CAP_PROP_XI_DOWNSAMPLING 时,我可以看到像素顺序正确的输出图像,但显示帧仍具有默认高分辨率并且输出图像显示多次(因素取决于我用于下采样的因子)。

我什至无法将 Mat 或 IplImage 强制为预定义的大小,因为这样会发生断言错误或访问冲突(Mat image(XRES,YRES,CV_8UC3,Scalar(0,0,255))(frame = cvCreateImage(cvSize( XRES, YRES), IPL_DEPTH_8U,3);. 我已经通过 frame.type() 检查过,输出是一个 CV_8UC3

我想要的是 648x486 的 Ximea 相机输出,显示在相同尺寸的(理想情况下)垫子中。有没有人遇到同样的问题?可能是由于我缺乏对工业相机配置/开发的了解,但我们将不胜感激。

情况: window 7(x64)Visual Studio 专业版 2012为 x86 编译的 OpenCV 版本 2.4.10,检查了以下标志:WITH_XIMEA 和 WITH_OPENGLx86 中的简单 VS2012 项目(发布和调试),用于相机流式传输和在窗口中显示相机帧。

简单代码片段(不是我的,从 opencv 教程和 ximea 复制而来):C++ 风格:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char **argv) {
VideoCapture cap(0); // open the default camera
//VideoCapture cap(CV_CAP_XIAPI);
if(!cap.isOpened()) // check if we succeeded
return -1;
cout<<" "<<cap.get(CV_CAP_PROP_FRAME_WIDTH)<<" "<<cap.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl; //output: 640, 480
cap.set(CV_CAP_PROP_FRAME_WIDTH,XRES);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,YRES);
cout<<" "<<cap.get(CV_CAP_PROP_FRAME_WIDTH)<<" "<<cap.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl; //output: 320, 240

for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
imshow("camera frame", frame);
if(waitKey(30) == 27) //wait for 'esc' key press
{
cout << "esc key is pressed by user" << endl;
break;
}
}
return 0;}
C 风格:

#include "cv.h" 
#include "highgui.h"
#include <stdio.h>
#include <iostream>

using namespace cv;
using namespace std;
// A Simple Camera Capture Framework
int main()
{
CvCapture* capture = cvCaptureFromCAM( CV_CAP_XIAPI );
if ( !capture ) {
fprintf( stderr, "ERROR: capture is NULL \n" );
getchar();
return -1;
}
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 648 );
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 486 );
// Create a window in which the captured images will be presented
cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
// Show the image captured from the camera in the window and repeat
while ( 1 ) {
// Get one frame
IplImage* frame = cvQueryFrame( capture );
cout<<cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); //output: 648
cout<<cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); //output: 486

cout<<frame->height<<frame->width<<endl; //output: 1944, 2592
if ( !frame ) {
fprintf( stderr, "ERROR: frame is null...\n" );
getchar();
break;
}
cvShowImage( "mywindow", frame );
// Do not release the frame!
//If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
//remove higher bits using AND operator
if ( (cvWaitKey(10) & 255) == 27 ) break;
}
// Release the capture device housekeeping
cvReleaseCapture( &capture );
cvDestroyWindow( "mywindow" );
return 0;
}

最佳答案

谢谢 karlphillip 的回答。不幸的是,你是对的,这不是一种理想的方式。所以我带着昨天的雪天,自己找到了解决办法:cap_ximea.cppresetCvImage() 方法有错误。

line 207 if( (int)image.width != width || (int)image.height != height || image.frm != (XI_IMG_FORMAT)format)

必须是:

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

关于c++ - 访问 Ximea 相机并使用 OpenCV 设置预定义分辨率显示令人困惑的输出,这是由于相机默认分辨率大小的 Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com