全志BSP攝像頭方案和opencv不兼容

首先,提出結論:我並沒有適配,同時也沒有找到解決這個問題的方法,最後我使用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、不要隨意在頂層修改攝像頭格式!!!攝像頭有時候並不支持,會造成遲遲讀不到幀的現象。

發佈了25 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章