人人草夜色在线观看,精品国产不卡一区国产精品200部,日本高清不卡在线,在线观看欧美一区二区三区

歡迎來到杭州智韜科技有限公司官方網(wǎng)站!
打開客服菜單
contact us

聯(lián)系我們

杭州智韜科技有限公司 > 新聞資訊 > 液晶顯示器上顯示USB攝像頭圖像
液晶顯示器上顯示USB攝像頭圖像
編輯 :

智韜科技

時間 : 2019-09-28 18:26 瀏覽量 : 79


如何讓USB攝像頭的圖像在顯示屏上顯示呢,下面的案例實現(xiàn)了VGA圖像在LCD液晶上面的顯示,希望各位提出寶貴的意見,非常感謝;

1.攝像頭讀取數(shù)據(jù),放在緩沖區(qū)videobuf中,格式有YUV,MJPEG,RGB等。然后再進行轉(zhuǎn)換成LCD所支持的RGB格式。除此之外還需要進行數(shù)據(jù)的縮放,以適合各種格式的分辨率,最后將數(shù)據(jù)寫入framebuffer。這樣LCD控制器將會framebuffer中的數(shù)據(jù)顯示到LCD上。

2.先構(gòu)造一個videodeivce結(jié)構(gòu)體,成員有表示格式的iPixelFormat成員,表示大小的iWidth,iHeight,用于操作的VideoOpr結(jié)構(gòu)體,其中有各種操作函數(shù)。這個操作函數(shù)結(jié)構(gòu)體中的函數(shù)有:InitDevice,ExitDevice,GetFrame,PutFrame,StartFrame,StopFrame等操作函數(shù)。

3.轉(zhuǎn)換結(jié)構(gòu)體有YUV2RGB,MJEPG2RGB,RGB2RGB三種結(jié)構(gòu)體。

4.采集模塊中:定義結(jié)構(gòu)體typedef struct VideoDevice;操作函數(shù)結(jié)構(gòu)體typedef struct VideoOpr;//用于操作攝像頭,這個操作函數(shù)結(jié)構(gòu)體放在上面那個VideoDevice結(jié)構(gòu)體中,作為成員;再定義一個typedef struct VideoBuf結(jié)構(gòu)體,用于存儲攝像頭讀取到的數(shù)據(jù)和格式。定義的操作都放在Video_manager.h文件中。

5.在video_manager.c文件中有函數(shù)RegisterVideoOpr(),ShowVideoOpr(),GetVideoOpr(),VideoInit()等。在V4l2.c文件中,構(gòu)造一個VideoOpr結(jié)構(gòu)體:static T_VideoOpr g_tV4l2VideoOpr;注冊結(jié)構(gòu)體函數(shù)是int V4l2Init(void);接下來的步驟就是填充這個g_tV4l2VideoOpr結(jié)構(gòu)體。參考luvcview可以逐步實現(xiàn)具體功能。

6.在上面這個結(jié)構(gòu)體中填充操作函數(shù):v4l2InitDevice()

Open() //調(diào)用系統(tǒng)調(diào)用,打開設(shè)備節(jié)點。

Ioctl(VIDIOC_QUERYCAP)//調(diào)用ioctl函數(shù),通過驅(qū)動查詢設(shè)備類型的結(jié)構(gòu)體tV4l2Cap。我們通過結(jié)構(gòu)體成員capabilities確定是否支持V4L2_CAP_VIDEO_CAPTURE即視頻捕捉設(shè)備,是否支持V4L2_CAP_STREAMING和V4L2_CAP_READWRITE接口的數(shù)據(jù)讀取方式。

Ioctl(VIDIOC_ENUM_FMT)//通過驅(qū)動以遍歷的方式查看當(dāng)前驅(qū)動支持的所有設(shè)備格式,并與當(dāng)前可支持的所有格式相比較,如果發(fā)現(xiàn)其中有可支持的格式,則可說明此驅(qū)動支持應(yīng)用中所需的格式。

Ioctl(VIDIOC_SET_FMT)//設(shè)置攝像頭輸出指定的格式。這個格式中使用的格式為上面函數(shù)得到的可支持的格式,使用的分辨率為LCD顯示設(shè)備的分辨率,如果驅(qū)動程序發(fā)現(xiàn)某些參數(shù)無法支持,如分辨率,它會調(diào)整這些參數(shù)并且返回應(yīng)用程序,這些實際設(shè)置的分辨率的返回值也將它保存起來。

Ioctl(VIDIOC_REQBUFS)//來請求分配緩沖區(qū),其中可設(shè)置將buf映射到應(yīng)用空間中。

Ioctl(VIDIOC_QUERYBUFS)我們設(shè)置申請4個緩沖區(qū),實際不一定申請了4個,申請結(jié)果也將它保存起來。如果我們是read,write調(diào)用,則不必mmap就可直接讀取數(shù)據(jù),如果是streaming接口方式讀取數(shù)據(jù),則接下來必須進行mmap方式,應(yīng)用層才能讀取數(shù)據(jù),且映射時針對每一個具體的 buffer,根據(jù)實際申請的緩沖區(qū)映射,并將每個映射后的地址保存起來。

Ioctl(VIDIOC_QBUF)//將緩沖區(qū)放入隊列

V4l2StartDevice

Ioctl(VIDIOC_STREAMON)//啟動攝像頭

V4l2StopDevice

Ioctl(VIDIOC_STREAMOFF)//關(guān)閉攝像頭

V4l2GetFrameForStreaming

Poll()//通過攝像頭文件節(jié)點來監(jiān)控設(shè)備數(shù)據(jù)。有數(shù)據(jù)后,將數(shù)據(jù)放入緩沖區(qū),并調(diào)用ioctl(VIDIOC_DQBUF)將緩沖區(qū)從隊列中取出來。

V4l2PutFrameForStreaming

Ioctl(VIDIOC_QBUF)//將緩沖區(qū)放入隊列。

V4l2GetFrameForReadWrite

Read();//讀取數(shù)據(jù),并將數(shù)據(jù)存放起來

7.每個格式下像素的大小:對應(yīng)YUV格式的像素,位寬為16位;對于MJPEG格式,沒有像素位寬而言;對于RGB565格式,像素位寬為16位。

8.接下來我們來進行格式的轉(zhuǎn)換。當(dāng)我們編寫Yuv2Rgb.c文件時我們設(shè)置只允許輸入格式為YUV格式,輸出格式為RGB565和RGB32格式。YUV轉(zhuǎn)到RGB的算法這里使用網(wǎng)上的算法,將YUV數(shù)據(jù)中取出R,G,B三種顏色的數(shù)據(jù)。并將RGB三種顏色數(shù)據(jù)分別保留第5位,6位,5位,最后合成16位顏色值。最后將這兩個字節(jié)的顏色值保存。當(dāng)我們編寫Mjpeg2Rgb.c文件時,我們需要把內(nèi)存中的JPEG圖像轉(zhuǎn)換為RGB圖像。MJPEG格式轉(zhuǎn)換為RGB格式的算法方法也是網(wǎng)上提供的,這個算法里JPEG圖片通過jpeg_read_scanlines函數(shù)讀出一行一行的數(shù)據(jù),并進行轉(zhuǎn)換。當(dāng)我們編寫Rgb2Rgb.c文件時,我們設(shè)置只允許輸入格式為RGB565格式。如果輸出格式也是RGB565格式的,則直接memcpy()復(fù)制得到輸出數(shù)據(jù)即可。如果輸出格式為RGB32,則先取出R,G,B三種顏色數(shù)據(jù),然后將數(shù)據(jù)重新合成RBG32格式即可。


熱門推薦:

cache
Processed in 0.007023 Second.