首先,提出結論:我並沒有適配,同時也沒有找到解決這個問題的方法,最後我使用V4L2獲取照片返回給opencv算法使用。
opencv和主線攝像頭適配良好,可以直接使用,BSP或多或少出現了很多問題。
我建議大家想要適配的話,可以去看看fswebcam裏的src_v4l2代碼,fswebcam在主線和bsp上都可以成功運行。
我只提出我在這個過程中遇到的問題
1、bsp方案中,需要設置S_INPUT
if(ioctl(s->fd, VIDIOC_S_INPUT, &i) == -1)
{
ERROR("Error selecting input %i", i);
ERROR("VIDIOC_S_INPUT: %s", strerror(errno));
return(-1);
}
錯誤描述:如果未設置,將會一開始就出現vfe select input flag = 0 s_input have not be used ,直接後續驅動崩潰。
2、我用的是gc0308攝像頭,這個攝像頭驅動有一些奇怪,你設置了錯誤格式,他不會返回錯誤,於是
static int autosetup_capture_mode_v4l2(CvCaptureCAM_V4L* capture)
{
if (try_palette_v4l2(capture, V4L2_PIX_FMT_BGR24) == 0)
{
capture->palette = PALETTE_BGR24;
}
else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YVU420) == 0)
{
capture->palette = PALETTE_YVU420;
}
else
if (try_palette_v4l2(capture, V4L2_PIX_FMT_YUV411P) == 0)
{
capture->palette = PALETTE_YUV411P;
}
else
在opencv,cap_v4l.cpp這裏,一開始設置BGR24,會“設置成功”,但是攝像頭並不支持這個格式,於是一定會出錯,目前出現過segmentation fault,或者取到幀了,但是一張圖上半部分是三塊一模一樣的圖,下半部分是彩塊。
但是即使我把這個格式設置爲攝像頭支持的UYVY,也沒有解決,最後出現一張圖上四小塊且整張圖都是綠色。
cap_v4l.cpp中有自行做UYVY to BGR的轉換,嘗試瞭解UYVY存儲方式看懂了,看不出錯來。
所以我也不再試圖修改cap_v4l.cpp,而是直接從v4l2獲取到圖片。
3、再說一個問題,並不是opencv的責任,而是全志驅動的問題,全志幾乎所有的sdk內核,在videodev2.h這個文件裏,v4l2_contrtol添加了一個u32 usr_pt,這會使得所有對s_ctrl或者g_ctrl全部失敗。
4、不要隨意在頂層修改攝像頭格式!!!攝像頭有時候並不支持,會造成遲遲讀不到幀的現象。