문제 설명의 크기가 매트에 의아해 출력을 보여줍니다. 따라서 기본 해상도와 미리 정의 된 해상도 (예 : 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;}
#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;
}
수정 사항이있는 OpenCV를 만들었습니까? – karlphillip
예, 정확하게. 그것을 cap.set (CV_CAP_PROP_XI_DOWNSAMPLING, 2)과 함께 시도해 해상도가 절반 (= 1296,972), cap.set (CV_CAP_PROP_FRAME_WIDTH, 648) 등 - 단지 작동한다는 것을 확인했습니다. 카메라의 기본 크기 (= 2592x1944)를 가진 초기에 생성 된 Ipimage가 변경된 속성의 업데이트를 가져 오는 메서드 변경에 영향을줍니다. – AfterEight