在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)Linux工控主板攝像頭應(yīng)用簡介

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-03 09:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近年來,隨著計(jì)算機(jī)、網(wǎng)絡(luò)以及圖像處理、傳輸技術(shù)的飛速發(fā)展,攝像頭在工業(yè)控制領(lǐng)域的應(yīng)用也越來越廣泛了,目前市面上的攝像頭可以分為兩類,一種是符合UVC規(guī)范的攝像頭,比如羅技的攝像頭就是UVC攝像頭。另一種是non-UVC攝像頭,即不符合UVC規(guī)范。UVC全稱為:USB video class (USB視頻類)在Linux-2.6.4及以上的版本都已經(jīng)集成了UCV設(shè)備的驅(qū)動(dòng),而non-UVC攝像頭如果要使用,就需要硬件廠商提供專用的驅(qū)動(dòng)。比如中星微的攝像頭就是non-UVC設(shè)備,需要專用的驅(qū)動(dòng)。

1、Linux內(nèi)核配置

本文以英創(chuàng)嵌入式板卡EM335x 為例來介紹對于USB攝像頭的支持,EM335x內(nèi)核版本為Linux-3.12.10,USB攝像頭選用中星微的ZC301攝像頭,該攝像頭以其高性價(jià)比得以廣泛應(yīng)用,同時(shí)在Linux內(nèi)核中已經(jīng)包括了對于ZC3XX系列攝像頭的驅(qū)動(dòng)支持。

內(nèi)核配置如下:
<*> Multimedia support --->
[*] Cameras/video grabbers support
[*] Media USB Adapters --->
<*> USB Video Class (UVC)
[*] UVC input events device support
<*> GSPCA based webcams --->
ZC3XX USB Camera Driver

編譯成功后,即可得到zc3xx系列USB攝像頭驅(qū)動(dòng)文件:gspca_zc3xx.ko。

在EM335x板卡上,該文件放置在根文件系統(tǒng)/lib/modules/3.12.10/目錄下。應(yīng)用時(shí)只需調(diào)用以下命令,即可完成對于USB攝像頭的驅(qū)動(dòng)加載。

insmod /lib/modules/3.12.10/gspca_zc3xx.ko

驅(qū)動(dòng)加載成功后,會(huì)自動(dòng)生成設(shè)備節(jié)點(diǎn):“/dev/video0',應(yīng)用程序可以操作該設(shè)備節(jié)點(diǎn)對攝像頭進(jìn)行圖像的采集和控制。因?yàn)橹行俏⒌臄z像頭為non-UVC設(shè)備,所以需要再加專用的gspca_zc3xx.ko,如果是其他的UVC攝像頭,內(nèi)核中已經(jīng)集成了驅(qū)動(dòng),插上后就可以識(shí)別出來,不用再加載其他驅(qū)動(dòng)。

2、Qt攝像頭應(yīng)用程序簡介

UVC和non-UVC攝像頭都是用了V4L2驅(qū)動(dòng)提供的API來操作攝像頭。Video for Linux two簡稱V4L2,是V4L的改進(jìn)版。V4L2是Linux操作系統(tǒng)下用于采集圖片、視頻音頻數(shù)據(jù)的API接口,配合適當(dāng)?shù)囊曨l采集設(shè)備和相應(yīng)的驅(qū)動(dòng)程序,可以實(shí)現(xiàn)圖片、視頻、音頻等的采集。在視頻監(jiān)控系統(tǒng)和嵌入式多媒體終端中都有廣泛的應(yīng)用。V4L2支持兩種方式來采集圖像:內(nèi)存映射方式(mmap)和直接讀取方式(read)。在這里我們使用內(nèi)存映射的方式來進(jìn)行視頻采集。應(yīng)用程序通過V4L2接口采集視頻數(shù)據(jù)可以分為五個(gè)步驟:

①打開視頻設(shè)備文件,進(jìn)行視頻采集的參數(shù)初始化,通過V4L2接口設(shè)置視頻圖像的采集窗口、采集的點(diǎn)陣大小和格式;
②申請若干視頻采集的幀緩沖區(qū),并將這些幀緩沖區(qū)從內(nèi)核空間映射到用戶空間,便于應(yīng)用程序讀取/處理視頻數(shù)據(jù);
③將申請到的幀緩沖區(qū)在視頻采集輸入隊(duì)列排隊(duì),并啟動(dòng)視頻采集;
④驅(qū)動(dòng)開始視頻數(shù)據(jù)的采集,應(yīng)用程序從視頻采集輸出隊(duì)列取出幀緩沖區(qū),處理完后,將幀緩沖區(qū)重新放入視頻采集輸入隊(duì)列,循環(huán)往復(fù)采集連續(xù)的視頻數(shù)據(jù);
⑤停止視頻采集。

可以參考下圖:

可以看到每一個(gè)步驟都是通過ioctl這個(gè)接口去設(shè)置一些參數(shù)來實(shí)現(xiàn)的, 啟動(dòng)視頻采集后,驅(qū)動(dòng)程序開始采集數(shù)據(jù),并把采集的數(shù)據(jù)放入視頻采集輸入隊(duì)列的第一個(gè)幀緩沖區(qū),當(dāng)一幀數(shù)據(jù)采集完成,也就是第一個(gè)幀緩沖區(qū)存滿數(shù)據(jù)以后,驅(qū)動(dòng)程序?qū)⑦@一個(gè)緩沖區(qū)移至視頻采集輸出隊(duì)列,等待應(yīng)用程序取出。驅(qū)動(dòng)程序接下來繼續(xù)采集下一幀數(shù)據(jù),并放入第二個(gè)幀緩沖區(qū),同樣幀緩沖區(qū)存滿數(shù)據(jù)后,被放入視頻采集輸出隊(duì)列。

應(yīng)用程序從視頻采集輸出隊(duì)列中取出含有視頻數(shù)據(jù)的幀緩沖區(qū),處理幀緩沖區(qū)中的視頻數(shù)據(jù),如存儲(chǔ)或壓縮。如果需要連續(xù)采集,應(yīng)用程序需要將處理完數(shù)據(jù)的幀緩沖區(qū)重新放入視頻采集輸入隊(duì)列,如圖所示。

接下來結(jié)合程序來具體看一看通過V4L2接口來操作攝像頭的一些重要的步驟:

打開設(shè)備文件:
int fd;
fd=open('/dev/video0',O_RDWR);

獲取設(shè)備的基本信息,包括驅(qū)動(dòng)版本號(hào),設(shè)備支持操作等:
struct v4l2_capability cap;
ret=ioctl(fd,VIDIOC_QUERYCAP,&cap);
if(ret<0)
{
printf('failture VIDIOC_QUERYCAP ');
return -1;
}
printf('DriverName:%s Card Name:%s Bus info:%s DriverVersion:%u.%u.%u ',cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0xFF,(cap.version>>8)&0xFF,cap.version&0xFF);

顯示所支持的格式:
memset(&fmtdesc, 0, sizeof(fmtdesc));
fmtdesc.index = 0;
//數(shù)據(jù)流類型,必須永遠(yuǎn)是V4L2_BUF_TYPE_VIDEO_CAPTURE
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)
{
printf('/t%d.%s/n',fmtdesc.index+1,fmtdesc.description);
fmtdesc.index++;
}

設(shè)置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個(gè)包括寬度和高度等:
struct v4l2_format fmt;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//數(shù)據(jù)流類型,必須永遠(yuǎn)是V4L2_BUF_TYPE_VIDEO_CAPTURE
fmt.fmt.pix.width = 640;//寬,必須是16的倍數(shù)
fmt.fmt.pix.height = 480;//高,必須是16的倍數(shù)
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;//視頻數(shù)據(jù)存儲(chǔ)類型//V4L2_PIX_FMT_YUYV;//V4L2_PIX_FMT_YVU420;//V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
//設(shè)置當(dāng)前驅(qū)動(dòng)的頻捕獲格式
ret = ioctl (fd, VIDIOC_S_FMT, &fmt);
if(ret<0)
{
printf('failture VIDIOC_S_FMT ');
return -1;
}

向驅(qū)動(dòng)申請幀緩沖,一般不超過五個(gè):
struct v4l2_requestbuffers req;
req.count=1;
req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory=V4L2_MEMORY_MMAP;
//申請幀緩沖
ret=ioctl(fd,VIDIOC_REQBUFS,&req);
if(ret<0)
{
printf('failture VIDIOC_REQBUFS ');
return -1;
}
if (req.count < 1)
{
printf('Insufficient buffer memory ');
return -1;
}

將申請到的幀緩沖映射到用戶空間,這樣就能夠直接操作幀緩沖了:
buffers =(buffer*)calloc (req.count, sizeof (*buffers));
if (!buffers) {
fprintf (stderr,'Out of memory/n');
exit(EXIT_FAILURE);
}
for (n_buffers = 0; n_buffers < req.count; ++n_buffers)
{
struct v4l2_buffer buf;
memset(&buf,0,sizeof(buf));
buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index =n_buffers;
//查詢序號(hào)為n_buffers 的緩沖區(qū),得到其起始物理地址和大小
if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
{
printf('failture VIDIOC_QUERYBUF ');
return -1;
}
buffers[n_buffers].length= buf.length;
//映射內(nèi)存
buffers[n_buffers].start=mmap (NULL,buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED,fd, buf.m.offset);
if (MAP_FAILED == buffers[n_buffers].start)
{
printf('failture mmap ');
return -1;
}
}

將申請到的幀緩沖全部入隊(duì)列,以便存放采集到的數(shù)據(jù):
for (i = 0; i< req.count; ++i)
{
struct v4l2_buffer buffer;
buffer.type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
buffer.memory =V4L2_MEMORY_MMAP;
buffer.index = i;
//將緩沖幀放入隊(duì)列尾
ioctl (fd,VIDIOC_QBUF, &buffer);
}

開始視頻的采集:
type =V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl (fd,VIDIOC_STREAMON, &type);

取出隊(duì)列中以取得采集數(shù)據(jù)的幀緩沖,獲得原始采集數(shù)據(jù),因?yàn)檫@個(gè)攝像頭支持的格式為JPG,所以程序中將原始數(shù)據(jù)保存在新建的一個(gè)*.jpg文件中:
struct v4l2_buffer camera_buf;
CLEAR (camera_buf);
camera_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
camera_buf.memory = V4L2_MEMORY_MMAP;
//取出一個(gè)緩沖幀
i1 = ioctl (fd, VIDIOC_DQBUF, &camera_buf);
if(i1<0)
{
printf('failture ');
return -1;
}
fwrite(buffers[camera_buf.index].start, buffers[camera_buf.index].length, 1, file_fd);//將其寫入文件中

將緩沖幀重新入隊(duì)列尾,這樣可以循環(huán)采集:
//將緩沖重新入隊(duì)列尾
i1=ioctl (fd, VIDIOC_QBUF, &camera_buf);
if(i1<0)
{
printf('failture VIDIOC_QBUF ');
return -1;
}

如果需要關(guān)閉攝像頭,先停止視屏采集,釋放申請的幀緩沖,最后關(guān)閉設(shè)備節(jié)點(diǎn):
//停止視頻的采集。VIDIOC_STREAMOFF
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == ioctl(fd, VIDIOC_STREAMOFF, &type))
printf('VIDIOC_STREAMOFF');
for (i = 0; i < n_buffers; ++i)
if (-1 == munmap (buffers->start, buffers->length))
printf ('munmap error');
free(buffers);
//關(guān)閉視頻設(shè)備
close (fd);

所以通過這一套通用的V4L2接口來操作攝像頭的工作流程:

打開設(shè)備-> 檢查和設(shè)置設(shè)備屬性->設(shè)置幀格式-> 設(shè)置一種輸入輸出方法(緩沖區(qū)管理)-> 循環(huán)獲取數(shù)據(jù)-> 關(guān)閉設(shè)備。通過這幾個(gè)步驟已經(jīng)可以操作攝像頭來獲取數(shù)據(jù),下面來看看如何與Qt結(jié)合,將前面的代碼與Qt界面結(jié)合起來。

在Qt中主要就是實(shí)現(xiàn)兩個(gè)功能,一個(gè)是通過界面控制攝像頭的數(shù)據(jù)獲取,另一個(gè)是通過界面顯示攝像頭所拍攝下來的圖片。攝像頭的初始化設(shè)置,包括格式等參數(shù)的設(shè)置可以在Qt界面的構(gòu)造函數(shù)中完成。

通過界面來控制攝像頭,可以在Qt的界面上做一個(gè)按鈕,在按鈕的單擊事件槽中調(diào)用攝像頭采集數(shù)據(jù)的部分即可:
void MainWindow::on_init_camera_clicked()//按鈕單擊事件
{
for (;;)//這一段涉及到異步IO
{
fd_set fds;
struct timeval tv;
int r;
FD_ZERO (&fds);//將指定的文件描述符集清空
FD_SET (fd, &fds);//在文件描述符集合中增加新的文件描述符
tv.tv_sec = 0;
tv.tv_usec = 500000;
r = select (fd + 1, &fds, NULL, NULL, &tv);//判斷是否可讀(即攝像頭是否準(zhǔn)備好),tv是定時(shí)
if (-1 == r)
{
if (EINTR == errno)
continue;
printf ('select err ');
}
if (read_frame ())//如果可讀,執(zhí)行read_frame ()函數(shù),并跳出循環(huán)
break;
else
{
QMessageBox::information(this, tr('失敗'), tr('拍攝圖片失敗') , QMessageBox::Ok);
}
}
}

關(guān)于拍攝圖片的顯示問題,Qt中提供了很多實(shí)現(xiàn)的方法,比如可以在界面中采用一個(gè)label來顯示,這里采用GraphicsView來顯示,主要代碼如下:
image=new QImage(pictrue_name);
image->load(pictrue_name);
scene = new QGraphicsScene;
scene->addPixmap(QPixmap::fromImage(*image));
ui->graphicsView->setScene(scene);
ui->graphicsView->setAlignment(Qt::AlignCenter);
ui->graphicsView->show();//顯示

將攝像頭獲取的數(shù)據(jù)寫入文件中,再通過GraphicsView顯示出來。這樣就實(shí)現(xiàn)了Qt程序和攝像頭操作的結(jié)合,詳細(xì)的代碼請參考例程。

例程的效果如下圖所示:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11508

    瀏覽量

    213573
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6100

    瀏覽量

    36265
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【Milk-V Duo S 開發(fā)板免費(fèi)體驗(yàn)】 OV5647 攝像頭攝像頭測試

    引言 以前使用Milk-V Duo的時(shí)候,覺得它的攝像頭支持比較弱,只能支持特定型號(hào)的攝像頭,還不好買。我有個(gè)學(xué)生甚至因?yàn)檫@個(gè)原因退出了集創(chuàng)賽。這次特意測試了一下它的攝像頭。 DuoS
    發(fā)表于 07-08 21:26

    canmv-k230使用攝像頭出現(xiàn)紫色畫面,并且顯示不完全怎么修復(fù)?

    攝像頭顯示畫面程序設(shè)置為開機(jī)自啟動(dòng),插type-C開機(jī),有一定概率出現(xiàn)紫色畫面的問題,并且攝像頭畫面顯示不完整,一直刷。 軟硬件版本信息 01studio主板,gc2093
    發(fā)表于 04-28 07:02

    嘉立創(chuàng)廬山派,攝像頭和處理后的畫面有辦法通過無線的方式傳遞給電腦嗎?

    如題:嘉立創(chuàng)廬山派,攝像頭和處理后的畫面有辦法通過無線的方式傳遞給電腦嗎?求大佬指點(diǎn)。
    發(fā)表于 04-27 08:34

    社區(qū)安裝IPC攝像頭,跟安裝一般安防監(jiān)控攝像頭有什么區(qū)別?

    為了保護(hù)社區(qū)或其他公共場所的安全,往往需要安裝監(jiān)控攝像頭。但隨著越來越多的公共安全事件發(fā)生,傳統(tǒng)只單純拍攝和記錄畫面的監(jiān)控攝像頭已不能滿足社區(qū)安防的需求,需要更多功能的安防監(jiān)控攝像頭來進(jìn)行更智能化
    的頭像 發(fā)表于 04-03 10:00 ?516次閱讀
    社區(qū)安裝IPC<b class='flag-5'>攝像頭</b>,跟安裝一般安防監(jiān)控<b class='flag-5'>攝像頭</b>有什么區(qū)別?

    車載攝像頭的EMC問題案例

    一前言 如今,車載攝像頭已經(jīng)不再僅僅是一個(gè)輔助設(shè)備,而是逐漸成為了智能駕駛系統(tǒng)中不可或缺的一部分。360度全景監(jiān)控、行車記錄儀以及自動(dòng)駕駛輔助功能,車載攝像頭的應(yīng)用范圍不斷拓展,技術(shù)也在不斷創(chuàng)新
    的頭像 發(fā)表于 12-18 11:11 ?1401次閱讀
    車載<b class='flag-5'>攝像頭</b>的EMC問題案例

    安防監(jiān)控攝像頭氣密性測試案例-連拓精密#攝像頭氣密檢測設(shè)備

    攝像頭
    連拓精密科技
    發(fā)布于 :2024年12月11日 15:00:21

    多光譜火焰檢測攝像頭

    ,成為現(xiàn)代火災(zāi)監(jiān)測領(lǐng)域的一項(xiàng)重要技術(shù)。多光譜火焰檢測攝像頭通過捕捉不同波段的光譜信息來識(shí)別火焰。與傳統(tǒng)攝像頭僅能獲取可見光信息不同,多光譜
    的頭像 發(fā)表于 12-11 10:50 ?721次閱讀
    多光譜火焰檢測<b class='flag-5'>攝像頭</b>

    攝像頭及紅外成像的基本工作原理

    本文介紹了攝像頭及紅外成像的基本工作原理,攝像頭可以將看到的圖像真實(shí)的呈現(xiàn)出來,所見即所得! 攝像頭如何工作? 攝像頭可以將看到的圖像真實(shí)的呈現(xiàn)出來,所見即所得。 ? 比如人眼看到的一
    的頭像 發(fā)表于 11-25 09:28 ?2311次閱讀
    <b class='flag-5'>攝像頭</b>及紅外成像的基本工作原理

    飛凌嵌入式-ELFBOARD-OV5640攝像頭簡介

    OV5640采用了CMOS圖像傳感器,也是我們ELF 1以及ELF 1S適配的攝像頭。OV5640為500w像素級(jí)攝像頭,最高支持2592x1944@15fps(QSXGA)【圖像有效顯示的區(qū)域
    發(fā)表于 11-18 11:14

    飛凌嵌入式-ELFBOARD-OV5640攝像頭簡介第一期

    OV5640采用了CMOS圖像傳感器,也是我們ELF 1以及ELF 1S適配的攝像頭。OV5640為500w像素級(jí)攝像頭,最高支持2592x1944@15fps(QSXGA)【圖像有效顯示的區(qū)域
    發(fā)表于 11-18 11:09

    用于環(huán)視和CMS攝像頭系統(tǒng)的四通道攝像頭應(yīng)用程序

    電子發(fā)燒友網(wǎng)站提供《用于環(huán)視和CMS攝像頭系統(tǒng)的四通道攝像頭應(yīng)用程序.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 10:02 ?0次下載
    用于環(huán)視和CMS<b class='flag-5'>攝像頭</b>系統(tǒng)的四通道<b class='flag-5'>攝像頭</b>應(yīng)用程序

    人流量檢測識(shí)別攝像頭

    人流量檢測識(shí)別攝像頭是一種結(jié)合了監(jiān)控攝像技術(shù)和智能分析技術(shù)的先進(jìn)設(shè)備,旨在通過實(shí)時(shí)監(jiān)測和分析監(jiān)控畫面中人員的數(shù)量、密度、流動(dòng)方向等信息,識(shí)別
    的頭像 發(fā)表于 09-25 10:58 ?807次閱讀
    人流量檢測識(shí)別<b class='flag-5'>攝像頭</b>

    CANape Option DA中參考攝像頭的標(biāo)定演示#CANape

    攝像頭
    北匯信息POLELINK
    發(fā)布于 :2024年07月30日 12:37:29

    安防攝像頭IPC芯片的應(yīng)用

    安防攝像頭IPC芯片的應(yīng)用
    的頭像 發(fā)表于 07-22 09:42 ?1484次閱讀
    安防<b class='flag-5'>攝像頭</b>IPC芯片的應(yīng)用
    主站蜘蛛池模板: 亚洲免费mv | 天天干天天拍天天射天天添天天爱 | 日本黄色一级网站 | 亚洲国产高清精品线久久 | 国产成人精品亚洲日本在线观看 | 黄网站免费大全 | 久久久久女人精品毛片 | 四虎影院永久免费 | 99久久精品免费观看国产 | 色多多影视 | 亚洲系列中文字幕一区二区 | 四虎久久影院 | 黄色在线播放网址 | 国产精品视频久久久 | 日本免费精品视频 | 日本午夜色 | 免费看特级淫片日本 | 中文字幕一二三区 | 欧美最猛性xxxx免费 | 日本久久久 | 一级毛片黄色 | 日本不卡免费新一区二区三区 | 777奇米影视笫四色88me久久综合 | 欧美性猛交xxxx乱大交高清 | 免费任我爽橹视频在线观看 | 天堂网www天堂在线网 | 日韩色爱| 欧美日韩伦理 | 激情五月亚洲 | 天天槽天天槽天天槽 | 四虎精品久久 | 国产综合视频在线观看 | 狠狠干亚洲色图 | 天堂bt资源新版在线 | 资源种子在线观看 | 成年人看的黄色 | 婷婷丁香激情 | 国产在线一卡 | 天堂资源在线中文 | 亚洲欧美日韩综合一区 | 国产午夜在线观看视频播放 |