天天看點

DM8127 彩轉黑的實作

最近在做DM8127項目,客戶要求具備彩轉黑、黑轉彩功能(DM8127  SDK  demo上沒有此功能),思索很久不知道從何下手,後來經過海量資料查閱,終于有了思路。既然是彩轉黑,那麼我把資料流(YUV資料)裡面的色彩分量(UV分量)給弄掉,隻保留亮度分量(Y分量),不就能夠實作彩轉黑了嘛! 黑轉彩就不用說了。有了這個思路,剩下的就是如何實作的問題啦,當然,實作的方法有很多種,我的實作方法如下:

      1、首先,在cameraLink_drv.c檔案裡面定義一個Iss_CaptResolution 全局數組變量gCaptResolution [CAMERA_LINK_MAX_OUT_QUE]。 為什麼要定義這個變量呢?是因為我們輸出多條碼流,每條碼流的分辨率不一樣,這個變量是儲存每條碼流的分辨率,以便處理。如果都是按照同一分辨率來處理的話,會導緻輸出的圖像出現橫條、花屏等現象。

     2、其次,當然要給gCaptResolution這個變量指派了,在哪裡指派呢?我選擇在CameraLink_drvSetResolution()函數裡面給gCaptResolution這個變量指派;

CameraLink_drvSetResolution()

{

..........

memcpy(&gCaptResolution [StreamId], &resolutionParams,sizeof(Iss_CaptResolution)); 這樣就給gCaptResolution 指派好了。

status = FVID2_control(pInst->cameraVipHandle,

                           IOCTL_ISS_CAPT_SET_RESOLUTION,

                           &resolutionParams, NULL);

........

}

   3、最後,就如何實作彩轉黑功能;

       pFrame->addr[0][0]裡面儲存的是Y分量;  pFrame->addr[0][1]裡面儲存的是UV分量。隻要把pFrame->addr[0][1]裡面的值設為128就可以實作彩轉黑效果。

我是在 CameraLink_drvProcessData()這個函數裡面實作的,具體實作如下:

       在這個for循環裡面 ,為什麼呢?在這個for循環裡面實作,可以對每條輸出的碼流進行處理。

for (frameId = 0; frameId < frameList.numFrames; frameId++)

{

..........

if(IRIS_FLAGE == TRUE)//我這裡是紅外打開的時候,進行彩轉黑

{

memset(pFrame->addr[0][1], 128, gCaptResolution[queId].ResolutionWidth*gCaptResolution[queId].ResolutionHeight );

}

status =  Utils_bufPutFullFrame();

    ........

}

這樣就搞定彩轉黑的功能了。希望此文能給需要的同僚們一點幫助,寫得不好,請諒解。

----------------------------------------轉載請保留原創,謝謝! ------------------------------------------