2014-09-29 103 views
1

我有一些攝像頭連接到我的樹莓派並使用OpenCV捕獲圖像。但是,即使相機沒有移動,圖像看起來也不穩定。當我只運行一個攝像頭時,這似乎不會發生,所以我認爲這是一個USB帶寬問題。爲了減少我開始嘗試降低幀速率的帶寬。羅技C210應該能夠支持5,10,15,20,25和30 fps的幀率。使用v4l2在Raspberry Pi上使用C++在Logitech C210攝像頭上設置幀速率

所以我一直在瀏覽v4l2的文檔,因爲看起來OpenCV無論如何都使用這個庫(雖然不是很好)。我一直在使用v4l2_ioctl()沒有問題設置相機控制。出於某種原因,我無法以類似的方式設置幀速率。以下是我沿着文檔here所做的工作:。

int descriptor = v4l2_open("/dev/video0", O_RDWR); 
v4l2_captureparm s; 
s.capability = V4L2_CAP_TIMEPERFRAME; 
s.timeperframe.numerator = 1; 
s.timeperframe.denominator = 5; 
if(v4l2_ioctl(descriptor, VIDIOC_S_PARM, &s) !=0) 
{ 
    cout<< "Failed to set frame rate "<<endl; 
} 

我沒有編譯問題,但我確實收到了錯誤信息,指出值沒有成功設置。

有沒有人有一個想法我做錯了什麼?

在此先感謝!

回答

2

您正在使用錯誤的結構。 Y0u應該使用

struct v4l2_streamparm 

,而不是

struct v4l2_captureparm 

首先檢查你的相機不支持所需resoulution和像素格式的幀速率:

v4l2-ctl --list-formats-ext 

然後,你需要設置的分辨率和像素格式。例如:

struct v4l2_format fmt; 
meset(&fmt, 0, sizeof(fmt)); 
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
fmt.fmt.pix.width  = 1280; 
fmt.fmt.pix.height  = 720; 
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; 
fmt.fmt.pix.field  = V4L2_FIELD_NONE; 

if (v4l2_ioctl(m_fd, VIDIOC_S_FMT, &fmt) != 0) 
{ 
    // Error 
} 

理想情況下,應從設備枚舉中選擇一個分子和分子。你也應該得到v4l2_streamparm結構:

struct v4l2_streamparm streamparm; 
memset(&streamparm, 0, sizeof(streamparm)); 
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
if (v4l2_ioctl(m_fd, VIDIOC_G_PARM, &streamparm) != 0) 
{ 
    // Error 
} 

streamparm.parm.capture.capturemode |= V4L2_CAP_TIMEPERFRAME; 
streamparm.timeperframe.numerator = X; 
streamparm.timeperframe.denominator = y; 
if(v4l2_ioctl(descriptor,VIDEO_S_PARM, &s) !=0) 
{ 
    cout<< "Failed to set frame rate "<<endl; 
} 
1

此外一定要檢查你沒有問題,這些攝像頭供電。這款產品無法通過USB端口提供強大的功能,並且任何類似WiFi加密狗(上帝,我討厭這個詞)都可能會爭奪權力,而且我之前看到了壞的照片......也許是一個與RPi兼容的供電集線器,即一個沒有與Pi連接的5v連接。購買rpi推薦的電源樞紐。

相關問題