2014-12-19 1 views
1

문제 설명의 크기가 매트에 의아해 출력을 보여줍니다. 따라서 기본 해상도와 미리 정의 된 해상도 (예 : capxset (CV_CAP_PROP_FRAME_WIDTH, 320), FRAME_HEIGHT, 240)로 640x480에서 320x240까지)로 프레임을 표시하면 두 가지 모두 정상적으로 작동합니다.는 Ximea 카메라를 액세스 및 OpenCV의와 미리 정의 된 해상도를 인해 카메라의 기본 해상도

Ximea 카메라 (VideoCapture 캡 (CV_CAP_XIAPI))와 작동하도록 약간의 조정으로 동일한 코드를 사용하면 기본 해상도로 작동합니다. 기본 해상도가 2592x1944 인 MU9PC_MH이므로 648x486은 필요한 낮은 해상도입니다.

수동으로 설정된 해상도의 경우 표시되는 창/그래 빙 프레임은 기본 해상도 (2592x1944)의 크기를 가지며이 거대한 디스플레이에서 캡처 된 픽셀의 양이 더 적으므로 상위 5 분의 1이 당황합니다 픽셀의 나머지 부분은 검은 색입니다.

이 효과는 VideoCapture 및 Mat와 C++ 및 C CvCaptureFromCAM 및 IplImage * 모두에서 발생합니다.

설정 플래그 CV_CAP_PROP_XI_DOWNSAMPLING을 사용할 때 올바른 순서로 픽셀이있는 출력 이미지를 볼 수 있지만 디스플레이 프레임은 여전히 ​​기본 고해상도를 유지하며 출력 이미지는 여러 번 표시됩니다 (요인은 내가 downsampling에 사용하고있는 요소).

매트 또는 IplImage를 미리 정의 된 크기로 강제 설정할 수 없습니다. 표식 또는 액세스 위반 오류가 발생하기 때문입니다 (매트 이미지 (XRES, YRES, CV_8UC3, 스칼라 (0,0,255)) (프레임 = cvCreateImage (cvSize (XRES, YRES), IPL_DEPTH_8U, 3); 나는 frame.type()을 통해 출력이 CV_8UC3임을 확인했습니다.

내가 원하는 것은 648x486의 Ximea 카메라 출력이 (이상적으로) 같은 크기의 매트 누구나 같은 문제가 발생 했습니까? 아마 산업용 카메라 구성/개발에 대한 지식이 부족하기 때문에 가능하지만 도움이 필요합니다.

상황 : Windows 7 (x64) Visual Studio Professional 2012 다음 플래그가 선택된 상태에서 OpenCV 버전 2.4.10이 컴파일 됨 : WITH_XIMEA 및 WITH_OPENGL 간단한 VS2012 카메라 스트리밍 및 카메라 프레임 표시를위한 x86의 프로젝트 (릴리스 및 디버그 모두 포함) 창문.

간단한 코드 조각 (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) { 
 
\t VideoCapture cap(0); // open the default camera 
 
\t //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 
 
\t cap.set(CV_CAP_PROP_FRAME_WIDTH,XRES); 
 
\t cap.set(CV_CAP_PROP_FRAME_HEIGHT,YRES); \t 
 
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 
 
\t \t { 
 
      cout << "esc key is pressed by user" << endl; 
 
\t \t \t break; 
 
\t \t } 
 
    } 
 
    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; 
 
}

답변

1

답장을 보내 주셔서 감사합니다. 불행히도, 이것이 이상적인 방법은 아니라는 것이 맞습니다. 그래서 저는 어제 눈 덮인 wheather를 가져 와서 직접 해결책을 찾았습니다 : 의 resetCvImage() 메소드에 실수가 있습니다.

라인 (207) ((INT) image.width! = || 폭 (INT) image.height! = 높이 || image.frm! = (XI_IMG_FORMAT) 형식)

가 있으면 다음과 같습니다 :

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

수정 사항이있는 OpenCV를 만들었습니까? – karlphillip

+0

예, 정확하게. 그것을 cap.set (CV_CAP_PROP_XI_DOWNSAMPLING, 2)과 함께 시도해 해상도가 절반 (= 1296,972), cap.set (CV_CAP_PROP_FRAME_WIDTH, 648) 등 - 단지 작동한다는 것을 확인했습니다. 카메라의 기본 크기 (= 2592x1944)를 가진 초기에 생성 된 Ipimage가 변경된 속성의 업데이트를 가져 오는 메서드 변경에 영향을줍니다. – AfterEight

0

VideoCapture::set() 반환 bool을 사용하면 방법. 이 호출의 성공/실패를 확인하고 필요한 경우 캡처 크기를 재조정하지 않고 응용 프로그램을 계속 실행해서는 안됩니다.

실제로 일부 카메라 드라이버는 임의의 크기를 허용하지 않으며 사용자가 할 수있는 일이 없습니다.그러나 기본 크기를 사용하여 프레임을 검색 한 다음 필요에 따라 cv::resize()을 검색 할 수 있습니다.

이상적은 아니지만 작업이 완료됩니다.

관련 문제