当前位置:文档之家› 摄像头图像采集程序与分析资料

摄像头图像采集程序与分析资料

摄像头图像采集程序与分析资料
摄像头图像采集程序与分析资料

打开摄像头:

case IDM_OPENCAMERA:

if(capDriverConnect(hwndCap, 0)==TRUE)

{

capDriverGetCaps(hwndCap , &CapDriver ,sizeof (CAPDRIVERCAPS) );

if (CapDriver.fHasOverlay)

capOverlay(hwndCap ,TRUE);

else

{

capPreviewRate(hwndCap ,66) ;

capPreview(hwndCap, TRUE) ;

}

}

else {

MessageBox(hwndCap,"打开摄像头错误!\n 确定摄像头是否已连接","错误

",MB_OK);

}break;

//采集,捕捉摄像头单帧图像

case IDM_CAPTUREIMG:

capGrabFrame( hwndCap);

break;

//保存摄像头采集的图片

case IDM_CAPIMGSA VE:

MenuOpenDlg(hwnd,"视频采集保存对话框","save");

capFileSaveDIB(hwndCap,TempName);

break;

//VideoCapture.cpp

#include

#include

#include

#include

#include "VideoCapture.h"

#include "resource.h"

char TempName[256];

HWND hwndCap;

HWND hwndSetCapStutas;

CAPDRIVERCAPS CapDriver;

CAPSTATUS CapStat;

2 / 17

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)

{

if(DialogBox(hInstance,(LPCSTR)IDD_DIALOG1,NULL,DlgProc)==-1) MessageBox(NULL,"对话框建立错误!","错误",MB_OK);

return 0;

}

BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM

lParam)

{

RECT rect;

switch(message)

{

case WM_INITDIALOG:

GetWindowRect(hdlg,&rect);

hwndCap =capCreateCaptureWindow(" 人脸录入" ,WS_CHILD|

WS_VISIBLE,30,20,320,240,hdlg ,0);

return FALSE;

case WM_COMMAND :

switch (LOWORD (wParam))

{

case IDOK :

if(capDriverConnect(hwndCap, 0)==TRUE)

{

capDriverGetCaps(hwndCap , &CapDriver ,sizeof (CAPDRIVERCAPS) );

if (CapDriver.fHasOverlay)

capOverlay(hwndCap ,TRUE);

else

{

capPreviewRate (hwndCap ,66) ;

capPreview(hwndCap, TRUE) ;

}

}

else

MessageBox(hdlg,"采集图像错误","提示",MB_OK);

return 0;

break;

case IDC_BUTTON1: 3 / 17

if(CapDriver.fHasDlgVideoSource)

capDlgVideoSource(hwndCap);

break;

case IDC_BUTTON2:

MessageBox(hdlg,"作者:Steward\n地址:云南大学信息学院","关于作者",MB_OK);

break;

case IDC_BUTTON3:

capGrabFrame( hwndCap);

break;

case IDC_BUTTON4:

MenuOpenDlg(hdlg,"视频采集保存对话框");

capFileSaveDIB(hwndCap,TempName);

break;

case IDCANCEL :

capCaptureStop(hwndCap);

capDriverDisconnect (hwndCap);

EndDialog (hdlg, 0) ;

return TRUE ;

}

break ;

}

return FALSE ;

}

void MenuOpenDlg(HWND hWnd,char *str1)

{

OPENFILENAME OpenTemp;

DWORD Errval,error;

char buf[5];

char Errstr[50]="GetOpenFileName returned Error #";

char szTemp[] = "BMP 文件(*.bmp;*.BMP)\0*.bmp\0所有文件(*.*)\0*.*\0";

OpenTemp.lStructSize = sizeof( OPENFILENAME );

OpenTemp.hwndOwner = hWnd;

OpenTemp.hInstance = 0;

OpenTemp.lpstrFilter = (LPSTR)szTemp;

OpenTemp.lpstrCustomFilter = NULL;

OpenTemp.nMaxCustFilter = 0;

OpenTemp.nFilterIndex = 1;

OpenTemp.lpstrFile = (LPSTR)TempName;

OpenTemp.nMaxFile = sizeof( TempName );

OpenTemp.lpstrFileTitle = NULL;

OpenTemp.nMaxFileTitle = 0; 4 / 17

OpenTemp.lpstrInitialDir = NULL;

OpenTemp.lpstrTitle=str1;

OpenTemp.Flags = OFN_FILEMUSTEXIST |

OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;

OpenTemp.nFileOffset = 0;

OpenTemp.nFileExtension = 0;

OpenTemp.lpstrDefExt = "*";

OpenTemp.lCustData = 0L;

OpenTemp.lpfnHook = NULL;

OpenTemp.lpTemplateName = NULL;

error=0;

if (GetSaveFileName( &OpenTemp ) != TRUE)

error=1;

if (error==1) {

Errval=CommDlgExtendedError();

if (Errval!=0) {

sprintf(buf,"%ld",Errval);

strcat(Errstr,buf);

MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);

}

}

InvalidateRect( hWnd, NULL, TRUE );

}

//资源文件

// Dialog

//

IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 203, 201

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "视频采集"

FONT 10, "System"

BEGIN

DEFPUSHBUTTON "打开",IDOK,31,143,39,14

PUSHBUTTON "退出",IDCANCEL,140,169,37,15

PUSHBUTTON "设置",IDC_BUTTON1,140,142,38,14

PUSHBUTTON "帮助",IDC_BUTTON2,84,170,38,14

PUSHBUTTON "捕捉图像",IDC_BUTTON3,85,142,38,15

PUSHBUTTON "保存图像",IDC_BUTTON4,32,170,37,14

END

// DESIGNINFO 5 / 17

GUIDELINES DESIGNINFO DISCARDABLE

BEGIN

IDD_DIALOG1, DIALOG

BEGIN

LEFTMARGIN, 7

RIGHTMARGIN, 196

TOPMARGIN, 7

BOTTOMMARGIN, 194

END

END

实现原理

用A VICAP.DLL实现图像采集,首先要用函数capCreateCaptureWindowA 创建一个视频

采集窗口,然后向视频采集窗口发送相应的消息,实现视频设备的连接、回调函数设置、预

览比例和速率设置、预览和叠加模式的设置、图像文件设置等操作。如果以上操作成功,就

可以通过视频设备采集图像了。回调函数由程序员编写,用于特殊的视频采集中,例如,在

视频会议中用回调函数将采集的视频和音频实时地传递到远程计算机中。

在VC++中,头文件VFW.H中不仅包含了A VICAP.DLL 中函数的原型定义,还定义了

与视频采集有关的数据结构、消息和发送消息的宏。利用这些函数、数据结构、消息和发送

消息的宏可以方便地编写图像采集程序,如果要对采集的图像实时处理,可以通过编写回调

函数实现。

实例分析

为了说明实现的方法和技巧,采用USB 接口的摄像头作为视频采集设备,在VC++6.0

中以实现采集一副图像为例说明。

在VC++6.0 中创建一个基于MFC 的单文档应用程序,工程名为“Video”,按照以下步

骤完成:

(1)在VideoView.h的首部加入语句:

#include "Vfw.h"

(2)打开“Project Settings”对话框,选择“Link”选项卡,在“Object/library modules”中输入

“vfw32.lib”。

(3)在VideoView.h中对类CVideoView 加入私有成员变量Hwndcap:

private:

//视频采集窗口的句柄

HWND Hwndcap;

(4)在Resources 面板中单击“Menu”,双击“IDR_MAINFRAME”,添加菜单项“采集”。在“采

集”下加入子菜单项“采集图像”和“保存BMP”,它们的ID 分别设为“ID_CAP_BMP”和

“ID_SA VE_BMP”。

(5)在MFC ClassWizard中,选择“Message Map”选项卡,在下拉列表框“Class name”中选择 6 / 17

“CVideoView”,在列表框“Object IDs”中选择“ID_CAP_BMP”,在列表框“Messages”中选择

“Command”,单击“Add Function”按钮添加成员函数OnCapBmp(),按照同样方法为

“ID_SA VE_BMP”响应消息“Command”添加成员函数OnSaveBmp()。再按照同样方法为

“CVideoView”响应消息“WM_SIZE”添加成员函数OnSize()。

(6)在类“CVideoView”的构造函数中加入:

Hwndcap=NULL;

(7)在类“CVideoView”的成员函数OnCapBmp()中加入以下代码:

CRect WRect;

//取得主窗口客户区域的位置和大小

GetClientRect(&WRect);

//创建视频采集窗口

Hwndcap=capCreateCaptureWindow(

(LPSTR) "采集图像",

WS_CHILD|WS_VISIBLE,

0,25,

WRect.Width(),WRect.Height(),

AfxGetMainWnd()->m_hWnd,

(int)0);

if(Hwndcap)

{

//连接视频采集设备

if(capDriverConnect(Hwndcap,0))

{

//设置视频预览图像的大小

capPreviewScale(Hwndcap,1);

//设置视频预览的速率

capPreviewRate(Hwndcap,66);

//设置视频以预览模式显示

capPreview(Hwndcap,1);

}

else

{//显示错误信息

MessageBox("摄像头未准备好!","提示信息",MB_OK|MB_ICONERROR);

//撤销视频采集窗口

::DestroyWindow(Hwndcap);

Hwndcap=NULL;

}}

(8)在类“CVideoView”的成员函数OnSaveBmp ()中加入以下代码:

if(Hwndcap)

//将当前帧保存为位图文件

capFileSaveDIB(Hwndcap,"test.bmp");

else

MessageBox("请先采集图像!",

"提示信息", 7 / 17

MB_OK|MB_ICONERROR);

(9)在类“CVideoView”的成员函数OnSize ()中加入以下代码:

CRect WRect;

//取得主窗口客户区域的位置和大小

GetClientRect(&WRect);

//设置视频采集窗口的位置和大小

::SetWindowPos(Hwndcap,

NULL,

0,25,

WRect.Width(),

WRect.Height(),

SWP_NOZORDER);

以上各步完成后,经过编译和连接生成可执行文件“Video.exe”。运行“Video.exe”,单击

菜单项“采集/采集图像”,结果如图1所示。

程序中的capDriverConnect 等是头文件“Vfw.h”中定义的宏,这些宏实质是向视频采集

窗口发送相应的消息,由于篇幅所限,这里对这些宏和消息的定义不作介绍,读

者可参阅

VC++中的头文件“Vfw.h”。

5 结束语

在VC++中利用A VICAP.DLL实现图像采集简单,编程代码量少,程序员编写回调函数

可以实现特殊需求的图像采集,不过,对于一般要求的图像采集不需要编写回调函数。

图1 程序运行结果

参考文献:

[1]赵军,平西建,肖永隆.视频信号的捕获采集编程[J].信息工程大学学报,2001,2(4):46-49.

[2]张弋,何晓,李艳军.多媒体信息捕获在Win32 编程中的实现[J].计算机工程,2002,28(2):

205-207.

[3]张元.基于A VICap窗口类的视频监控及捕捉的实现[J].电脑知识与技术,2004,(14):7-9.

[4]阮林波,曹锦云. 基于USB 摄像头的自动监控系统[J].计算机工程与设计,2004,25(6):988-989.

8 / 17

前言

DirectShow 是微软公司提供的一套在Windows 平台上进行流媒体处理的开发包,与

DirectX 开发包一起发布。DirectShow 为多媒体流的捕捉和回放提供了强有力的支持。用

DirectShow 开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,

并且进行相应的后期处理乃至存储到文件中。

DirectShow 是基于COM的,为了编写DirectShow应用程序,需要了解COM 客户程序

编写的基础知识。DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构

建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。

编程思路

为了更加容易建立视频捕捉应用程序,DirectShow 提供了一个叫做Capture Graph

Builder 的对象,Capture Graph Builder 提供IcaptureGraphBuilder2接口,该接口可以建立和

控制Capture Graph。

建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个

适当的视频捕捉设备。选择好设备后,为该设备创建Capture filter,然后调用AddFilter 把

Capture filter 添加到Filter Graph。

如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2::RenderStream就可以了:

ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder

//省略初始化部分代码

IBaseFilter *pCap; // Video capture filter.

//省略初始化和添加到Filter Graph部分代码

pBuild-> RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL,

NULL);

DirectShow 提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下

三个步骤就可以了:

第一步, 定义一个类实现Sample Grabber 的回调接口IsampleGrabberCB:class CSampleGrabberCB : public ISampleGrabberCB

{

//在后面提供的类中具体完成

}

CSampleGrabberCB mCB;

第二步、调用RenderStream依次把Still pin、Sample Grabber 和系统默认Renderer Filter

连接起来。

第三步、配置Sample Grabber 以捕获数据。

视频捕捉类CCaptureVideo的具体实现

// CCaptureVideo视频捕捉类头文件

/////////////////////////////////////////////////////////////////////

#if !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C42 87AA0__IN

CLUDED_)

#define

AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__IN CLUDED_

/////////////////////////////////////////////////////////////////////

// CaptureVideo.h : header file

///////////////////////////////////////////////////////////////////// 9 / 17

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include

#include

#include

#ifndef SAFE_RELEASE

#define SAFE_RELEASE( x )

if ( NULL != x )

{

x-> Release( );

x = NULL;

}

#endif

class CSampleGrabberCB;

class CCaptureVideo : public CWnd

{

friend class CSampleGrabberCB;

public:

void GrabOneFrame(BOOL bGrab);

HRESULT Init(int iDeviceID,HWND hWnd);

int EnumDevices(HWND hList);

CCaptureVideo();

virtual ~CCaptureVideo();

private:

HWND m_hWnd;

IGraphBuilder *m_pGB;

ICaptureGraphBuilder2* m_pCapture;

IBaseFilter* m_pBF;

IMediaControl* m_pMC;

IVideoWindow* m_pVW;

CComPtr

m_pGrabber;

protected:

void FreeMediaType(AM_MEDIA_TYPE& mt);

bool BindFilter(int deviceId, IBaseFilter **pFilter);

void ResizeVideoWindow();

HRESULT SetupVideoWindow();

HRESULT InitCaptureGraphBuilder();

};

#endif

// !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C428 7AA0__INC

LUDED_)

//------------------------------------------------------------------- 10 / 17

// CCaptureVideo视频捕捉类实现文件CaptureVideo.cpp

//-------------------------------------------------------------------

// CaptureVideo.cpp: implementation of the CCaptureVideo class.

//

/////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "CaptureVideo.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

BOOL bOneShot=FALSE;//全局变量

class CSampleGrabberCB : public ISampleGrabberCB

{

public:

long lWidth;

long lHeight;

TCHAR m_szFileName[MAX_PATH];// 位图文件名称

CSampleGrabberCB( ){

strcpy(m_szFileName, "c:donaldo.bmp");

}

STDMETHODIMP_(ULONG) AddRef() { return 2; }

STDMETHODIMP_(ULONG) Release() { return 1; }

STDMETHODIMP QueryInterface(REFIID riid, void ** ppv){

if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ){

*ppv = (void *) static_cast

( this );

return NOERROR;

}

return E_NOINTERFACE;

}

STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ){

return 0;

}

STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ){

if( !bOneShot )return 0;

if (!pBuffer)return E_POINTER;

SaveBitmap(pBuffer, lBufferSize);

bOneShot = FALSE;

return 0;

}

//创建位图文件

BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize ) 11 / 17

{

HANDLE hf = CreateFile(

m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,

CREATE_ALWAYS, NULL, NULL );

if( hf == INV ALID_HANDLE_V ALUE )return 0;

// 写文件头

BITMAPFILEHEADER bfh;

memset( &bfh, 0, sizeof( bfh ) );

bfh.bfType = ’MB’;

bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );

bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );

DWORD dwWritten = 0;

WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );

// 写位图格式

BITMAPINFOHEADER bih;

memset( &bih, 0, sizeof( bih ) );

bih.biSize = sizeof( bih );

bih.biWidth = lWidth;

bih.biHeight = lHeight;

bih.biPlanes = 1;

bih.biBitCount = 24;

WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );

// 写位图数据

WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );

CloseHandle( hf );

return 0;

}

};

CSampleGrabberCB mCB;

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CCaptureVideo::CCaptureVideo()

{

//COM Library Intialization

if(FAILED(CoInitialize(NULL))) /*, COINIT_APARTMENTTHREADED)))*/ {

AfxMessageBox("CoInitialize Failed!rn");

return;

}

m_hWnd = NULL;

m_pVW = NULL;

m_pMC = NULL;

m_pGB = NULL; 12 / 17

m_pCapture = NULL;

}

CCaptureVideo::~CCaptureVideo()

{

// Stop media playback

if(m_pMC)m_pMC-> Stop();

if(m_pVW){

m_pVW-> put_Visible(OAFALSE);

m_pVW-> put_Owner(NULL);

}

SAFE_RELEASE(m_pCapture);

SAFE_RELEASE(m_pMC);

SAFE_RELEASE(m_pGB);

SAFE_RELEASE(m_pBF);

CoUninitialize( );

}

int CCaptureVideo::EnumDevices(HWND hList)

{

if (!hList)

return -1;

int id = 0;

//枚举视频扑捉设备

ICreateDevEnum *pCreateDevEnum;

HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);

if (hr != NOERROR)return -1;

CComPtr

pEm;

hr = pCreateDevEnum-> CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm,

0);

if (hr != NOERROR)return -1;

pEm-> Reset();

ULONG cFetched;

IMoniker *pM;

while(hr = pEm-> Next(1, &pM, &cFetched), hr==S_OK)

{

IPropertyBag *pBag;

hr = pM-> BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);

if(SUCCEEDED(hr))

{

V ARIANT var;

var.vt = VT_BSTR;

hr = pBag-> Read(L"FriendlyName", &var, NULL);

if (hr == NOERROR) 13 / 17

{

TCHAR str[2048];

id++;

WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);

::SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)str);

SysFreeString(var.bstrVal);

}

pBag-> Release();

}

pM-> Release();

}

return id;

}

HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)

{

HRESULT hr;

hr = InitCaptureGraphBuilder();

if (FAILED(hr)){

AfxMessageBox("Failed to get video interfaces!");

return hr;

}

// Bind Device Filter. We know the device because the id was passed in

if(!BindFilter(iDeviceID, &m_pBF))return S_FALSE;

hr = m_pGB-> AddFilter(m_pBF, L"Capture Filter");

// hr = m_pCapture-> RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,

// m_pBF, NULL, NULL);

// create a sample grabber

hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );

if( !m_pGrabber ){

AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not

智能车模拟摄像头图像采集方法详解

本帖最后由 superyongzhe 于 2009-11-16 23:24 编辑 我想大家肯定还遇到一个问题,那就是如何知道自己采集的图像是否正确呢?可以使用串 口,大家把我那个程序里面的printp.c 复制到你的工程里,再把includes.h里面的声明添加到你的程序里,在串口初始化程序里 设置好波特率(如何设置可参考《单片 机嵌入式在线开发方法》一书中的相关内容,也可以看芯片资料)。上位机可以使用“串口 助手就可以了”,很简单的。如果大 家还有什么问题就赶快提出来把,我尽量给大家解决,因为这里面前车的东西比较繁杂,我 一下说不清楚。最好有个电视机,能 够看到摄像头摄在那里,这样会更容易校对 近几天看到论坛里有很多网友遇到CCD图像采集的麻烦,我在最开始的时候也为这个烦恼过,由于本人比较菜,在度过大概半个月的绝望日夜后,在刚准备放弃时突然发现我已经采集到正确的图像了。特再次分享,希望能解决大家当前遇到的麻烦。 在采集图像之前,我们首先要知道摄像头输出信号的特性。目前的模拟摄像头一般都是PAL制式的,输出的信号由复合同步信号,复合消隐信号和视频信号。其中的视频信号才是真正的图像信号,对于黑白摄像头,图像越黑,电压越低,图像越白,电压越高。而复合同步信号是控制电视机的电子枪对电子的偏转的,复合消隐信号是在图像换行和换场时电子枪回扫时不发射电子。由于人眼看到的图像大于等于24Hz时人才不会觉得图像闪烁,所以PAL 制式输出的图像是25Hz,即每秒钟有25幅画面,说的专业点就是每秒25帧,其中每一帧有625行。但由于在早期电子技术还不发达时,电源不稳定,容易对电视信号进行干扰,而交流电源是50Hz所以,为了和电网兼容,同时由于25Hz时图像不稳定,所以后来工程师们把一副图像分成两场显示,对于一幅画面,一共有625行,但是电子枪先扫描奇数场1,3,5.....,然后再扫描2,4,6.....,所以这样的话,一副图像就变成了隔行扫描,每秒钟就有50场了。其中具体的细节请参考这个网站 电视原理与系统 /zjx/zjx09/zjx090000.htm 只用看前面的黑白全电视信号和PAL制式就可以了(当然如果感兴趣可以全部看完)。 通过上面的内容如果你对PAL制式信号了然于心,那么就可以开始图像的采集了,PAL 输出的信号有复合同步信号,复合消隐信号和视频信号。那么我们首先就是要从这三种信号中分理出复合同步信号,复合消隐信号和视频信号,以便我们对AD采样到的值进行存储,

LabVIEW应用于实时图像采集及处理系统

LabVIEW应用于实时图像采集及处理系统 2008-7-29 9:35:00于子江娄洪伟于晓闫丰隋永新杨怀江供稿 摘要:本文在LabVIEW和NI-IMAQ Vision软件平台下,利用通用图像采集卡开发一种图像实时采集处理虚拟仪器系统。通过调用动态链接库驱动通用图像采集卡完成图像采集,采集图像的帧速率达到25帧每秒。利用NI-IMAQ Vision视频处理模块,进行图像处理,以完成光电探测器的标定。该系统具有灵活性强、可靠性高、性价比高等优点。 主题词:虚拟仪器;图像处理;LabVIEW;动态链接库 1.引言 美国国家仪器(NI)公司的虚拟仪器开发平台LabVIEW,使用图形化编程语言编程,界面友好,简单易学,配套的图像处理软件包能提供丰富的图像处理与分析算法函数,极大地方便了用户,使构建图像处理与分析系统容易、灵活、程序移植性好,大大缩短了系统开发周期。在推出应用软件的基础上,NI公司又推出了图像采集卡,对于NI公司的图像采集卡,可以直接使用采集卡自带的驱动以及LabVIEW中的DAQ库直接对端口进行操作。 但由于NI公司的图像采集卡成本很高,大多用户难以接受,因此硬件平台往往采用通用图像采集卡,软件方面的图像处理程序仍采用LabVIEW以及视频处理模块编写。本文正是基于这样的目的,提出了一种在LabVIEW环境下驱动通用图像采集卡的方案,在TDS642EVM高速DSP视频处理板卡的平台下,完成实时图像采集及处理。 在图象处理的工作中主要完成对CCD光电探测器的辐射标定。由于探测器在自然环境下获取图像时,会受到来自大气干扰,自身暗电流,热噪声等影响,使CCD像元所输出信号的数值量化值与实际探测目标辐射亮度之间存在差异,所以要得到目标的精确图像就必须对探测器进行辐射标定。 2.图像采集卡简介 闻亭公司TDS642EVM(简称642)多路实时视频处理板卡是基于DSP TMS320DM642芯片设计的评估开发板。计算能力可达到4Gips,板上的视频接口和视频编解码芯片Philips SAA7115H相连,实现实时多路视频图像采集功能,支持多种PAL,NTSC和SECAM视频标准。本系统通过642的PCI接口与主机进行数据交换。PCI支持“即插即用(PnP)”自动配置功能,使图像采集板的配置变得更加方便,其一切资源需求的设置工作在系统初启时交由BIOS处理,无需用户进行繁琐的开关与跳线操作。PCI接口的海量数据吞吐,为其完成实时图像采集和处理提供保证。 3.系统组成及工作原理

STM32单片机ov760摄像头进行图像采集处理

#include #include #include #include #include #include #include #include #include "Image.h" #include "include.h" float kp,kd,ki; s16 steererr = 0; u8 Get_a_Y() { u8 t1,t2; //获得一个Y分量的过程 FIFO_RCK=0; FIFO_RCK=1; t1=(0x00ff&GPIOB->IDR); FIFO_RCK=0; FIFO_RCK=1; t2=(0x00ff&GPIOB->IDR); //跳过一个像素 FIFO_RCK=0; FIFO_RCK=1; t2=(0x00ff&GPIOB->IDR); FIFO_RCK=0; FIFO_RCK=1; t2=(0x00ff&GPIOB->IDR); return t1; }

void skip_a_row() { u16 i; u8 temp; for (i=0;i<320;i++) { //跳过一个像素 FIFO_RCK=0; FIFO_RCK=1; temp=(0x00ff&GPIOB->IDR); FIFO_RCK=0; FIFO_RCK=1; temp=(0x00ff&GPIOB->IDR); } } void Get_a_Image() { u16 i,j; for (i=0;i

基于Labview的图像采集与处理

目前工作成果: 一、USB图像获取 USB设备在正常工作以前,第一件要做的事就是枚举,所以在USB摄像头进行初始化之前,需要先枚举系统中的USB设备。 (1)基于USB的Snap采集图像 程序运行结果: 此程序只能采集一帧图像,不能连续采集。将采集图像函数放入循环中就可连续采集。

循环中的可以计算循环一次所用的时间,运行发现用Snap采集图像时它的采集速率比较低。运行程序时移动摄像头可以清楚的看到所采集的图像有时比较模糊。 (2)基于USB的Grab采集图像 运行程序之后发现摄像头采集图像的速率明显提高。

二、图像处理 1、图像灰度处理 (1)基本原理 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可用两种方法来实现。 第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。 第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。 (2)labview中图像灰度处理程序框图 处理结果:

如何用摄像头来测距剖析

)VC) 版权声明:本文为博主原创文章,未经博主允许不得转载。 如何用摄像头来测距(opencv) 作者:郭世龙 最近一直忙着找工作,blog都长草了,今天把以前作的一个东西放上来充充门面吧。记得在哪看到过老外做的这个东西,觉得很好玩,就自己也做了一个。在摄像头下面固定一个激光笔,就构成了这个简易的测距装置。看一下图吧。

原理 假设激光束是与摄像头的光轴完全平行,激光束的中心落点在在摄像头的视域中是最亮的点。激光束照射到摄像头视域中的跟踪目标上,那么摄像头可以捕捉到这个点,通过简单的图像处理的方法,可以在这侦图像中找到激光束照射形成的最亮点,同时可以计算出Y轴上方向上从落点到图像中心的象素的个数。这个落点越接近图像的中心,被测物体距离机器人就越远。由下图图可以计算距离D: (1) 等式中h是一个常量,是摄像头与激光发射器之间的垂直距离,可以直接测量获得。 θ可通过下式计算: θ=Num*Rop+Offset(2) 其中:Num是从图像中心到落点的像素个数 Rop是每个像素的弧度值 Offset是弧度误差 合并以上等式可以得到: (3) Num可以从图像上计算得到。Rop和Offset需要通过实验计算获得。首先测量出D的准确值,然后根据等式(1)可以计算出准确的θ,根据等式(2)可到只含有参数Rop和Offset 的方程。在不同的距离多次测量D的准确值计算θ,求解方程组可以求出Rop和Offset。这里Rop=0.0030354,Offset=0.056514344。

程序 头文件: class LaserRange { public: struct RangeResult * GetRange(IplImage * imgRange,IplImage * imgDst); LaserRange(); virtual ~LaserRange(); private: unsigned int maxW; unsigned int maxH; unsigned int MaxPixel; RangeResult * strctResult; // Values used for calculating range from captured image data const double gain; // Gain Constant used for converting pixel offset to angle in radians const double offset;// Offset Constant const double h_cm; // Distance between center of camera and laser

PCB图像采集系统研究背景意义及国内外现状

PCB图像采集系统研究背景意义及国内外现状 1 研究背景 2 AOI系统的研究和国内现状 3 研究意义 1 研究背景 印刷电路板(Printed Circuit Board,PCB)又称为印刷线路板或印制电路板。印刷电路板是各种电子产品的主要部件,有“电子产品之母”之称,它是任何电子设备及产品均需配备的,其性能的好坏在很大程度上影响到电子产品的质量。几乎每一种电子设备都离不开PCB,小到电子手表、计算器,大到航空航天、军用武器系统等,都包含各式各样,大小各异的PCB板。近年来,随着生产工艺的不断提高,PCB正在向超薄型、小元件、高密度、细间距方向快速发展。这种趋势必然给质量检测工作带来了很多挑战和困难。因此PCB故障的检测已经成为PCB制造过程中的一个核心问题,是电子产品制造厂商非常关注的问题。在生产线上,厂家为保证PCB板的质量,就得要求100%的合格率,对所有的部件、子过程和成品都是如此。在过去靠人工对其进行检测的过程中,存在以下几个不可避免的缺点: (1)容易漏检。由于是人眼检测,眼睛容易疲劳,会造成故障不能被发现的问题。并且人工检测主观性大,判断标准不统一,使检测质量变得不稳定。 (2)检测速度慢,检测时间长。比如对于图形复杂的印刷电路板,人工很难实现快速高效的检测,因此人工检测不能满足高速的生产效率。 (3)随着技术的发展,设备的成本降低,人工费用增加,仍然由人工进行产品质量控制,将难于实现优质高效,而且还会增加生产成本。 (4)在信息技术如此发达的今天人工检测有不可克服的劣势,例如:对检测结果实时地保存和远距离传输,对原始图像的保存和远距离传输等。 (5)有些在线检测系统是接触式检测,需要与产品进行接触测量,因此,有可能会损伤产品。 因此,人工检测的精确性和可靠性大打折扣,传统意义上的检测方法不再能适应现代电路板检测的要求。如果漏检的有错误的电路板进入下一道工序,随着每一项工艺步骤的增加,到最终经过贴装阶段后,仍然会被检测出来是有故障的,那时,制造厂商与其花费大量的人力和成本来检测、返修这块电路板,还不如选

基于摄像头的图像采集与处理应用

基于摄像头得图像采集与处理应用 1、摄像头工作原理 图像传感器,就是组成数字摄像头得重要组成部分。根据元件得材料不同,可分为 CCD(Charge Coupled Device,电荷耦合元件)与CMOS(plementary MetalOxide Semiconductor,金属氧化物半导体元件)两大类。 电荷藕合器件图像传感器CCD(Charge Coupled Device),它使用一种高感光度得半导体材料制成,能把光线转变成电荷,通过模数转换器芯片转换成数字信号,数字信号经过压缩以后由相机内部得闪速存储器或内置硬盘卡保存,因而可以轻而易举地把数据传输给计算机,并借助于计算机得处理手段,根据需要与想像来修改图像。CCD由许多感光单位组成,通常以百万像素为单位。当CCD表面受到光线照射时,每个感光单位会将电荷反映在组件上,所有得感光单位所产生得信号加在一起,就构成了一幅完整得画面。 互补性氧化金属半导体CMOS(plementary MetalOxide Semiconductor)与CCD一样同为在图像传感器中可记录光线变化得半导体。CMOS主要就是利用硅与锗这两种元素所做成得半导体,使其在CMOS上共存着带N(带–电)与P(带+电)级得半导体,这两个互补效应所产生得电流即可被处理芯片纪录与解读成影像。然而,CMOS得缺点就就是太容易出现杂点, 这主要就是因为早期得设计使CMOS在处理快速变化得影像时,由于电流变化过于频繁而会产生过热得现象。 CCD与CMOS在制造上得主要区别就是CCD就是集成在半导体单晶材料上,而CMOS就是集成在被称做金属氧化物得半导体材料上,工作原理没有本质得区别。CCD制造工艺较复杂,采用CCD得摄像头价格都会相对比较贵。事实上经过技术改造,目前CCD与CMOS得实际效果得差距已经减小了不少。而且CMOS得制造成本与功耗都要低于CCD不少,所以很多摄像头生产厂商采用得CMOS感光元件。成像方面:在相同像素下CCD得成像通透性、明锐度都很好,色彩还原、曝光可以保证基本准确。而CMOS得产品往往通透性一般,对实物得色彩还原能力偏弱,曝光也都不太好,由于自身物理特性得原因,CMOS得成像质量与CCD还就是有一定距离得。但由于低廉得价格以及高度得整合性,因此在摄像头领域还就是得到了广泛得应用 工作原理:为了方便大家理解,我们拿人得眼睛来打个比方。当光线照射景物,景物上得光线反射通过人得晶状体聚焦,在视网膜上就可以形成图像,然后视网膜得神经感知到图像将信息传到大脑,我们就能瞧见东西了。摄像头成像得原理与这个过程非常相似,光线照射景物,景物上得光线反射通过镜头聚焦,图像传感器就会感知到图像。 具体部分就是这样得,摄像头按一定得分辨率,以隔行扫描得方式采集图像上得点,当扫描到某点时,就通过图像传感芯片将该点处图像得灰度转换成与灰度一一对应得电压值,然后将此电压值通过视频信号端输出。如图1所示,摄像头连续地扫描图像上得一行,则输出就就是

对摄像头采集图像的处理(1)

1. 图像处理 4.2.1目标指引线的提取 智能车通过图像采样模块获得车前方的赛道图像信息,往下介绍如何 分析此二维数组来提取黑线,我们采用边缘检测的方法。 二维数组的行数和列数即为像素的图像坐标,我们若求出了黑线边缘 的图像坐标,就知道了黑线的位置。黑线边缘的特点是其左、右两像素为 一黑一白,两像素值的差的绝对值大于某阀值,大于可根据试验确定;而 其余处的相邻两像素或全白,或全黑,像素值差的绝对值小于该阀值。这 样,只要我们对两数组每行中任何相邻两点做差,就可以根据差值的大小 是否大于该阀值来判断此两点处是否为黑线边缘,还可以进行根据差值的 正负来判定边缘处是左白右黑,还是右黑左白。 从最左端的第一个有效数据点开始依次向右进行阀值判断:由于实际 中黑白赛道边缘可能会出现模糊偏差,导致阀值并不是个很简单介于两相 邻之间,很可能要相隔两个点。因此:第line为原点,判断和line+3的差 是否大于该阀值,如果是则将line+3记为i,从i开始继续在接下的从i+3到该行最末一个点之间的差值是否大于阀值,如果大于则将line+i/2+1的坐 标赋给中心给黑线中心位置值,如5-4

图4-4单行黑线提取法 利用该算法所得到的黑线提取效果不仅可靠,而且实时性好;在失去 黑线目标以后能够记住是从左侧还是从右侧超出视野,从而控制舵机转向让赛车回到正常赛道。 试验表明:只要阀值取得合适,该算法不仅可靠,而且实时性较好。 如果更进一步可以设置阀值根据现场情况的变化而变化。在黑线引导线已经能够可靠提取的基础上,我们可以利用它来进行相应的弯、直道判定,以及速度和转向舵机控制算法的研究。 2.

摄像头参数测试指导分析解析

摄像头测试指导手册 一、测试环境及测试条件 1、暗室:不能反光、透光、关灯后照度低于1Lx,墙面用18度灰的灰布。如无特殊 规定,为保证摄像设备拍摄测试图卡时能够输出足够的信号,拍摄时测试图卡表面照度范围应在700Lx~1200Lx之间,测试时饱和度和均匀度可根据实际调节,正常测试使用D65光源,光强度不足需使用相同光源补光。 2、在D65光源色温下,测试图卡上任何一点的照度与测试图卡中心照度差不大于10%; 在其他色温下,测试图卡上任何一点的照度与测试图卡中心照度差不大于30%,光源应采取必要的遮光措施,防止光源直射镜头。测试图卡周围应是低照度,以减少炫光,测试时应尽量避免外界光线照射。测试图卡背景采用黑或吸光型中性灰。 3、测试中可使下列标准色温:D65光源色温6500K、泛光灯色温3400K。实际测试环 境的色温标准偏差应不大于200K,色温从2700k-7500k 可调换。 4、温度20±2℃,相对湿度50±20%。 5、测试距离可根据实际任意调整。摄像头与图卡距离建议为80-130cm,实际测试中 若超过以上范围需要标注。 6、图表放臵:放臵图表时使之与相机的焦点面平行,并且使得横向看时,水平方向 的粗框与画面水平框平行。根据iso12233的规定,拍摄时让图表的有效高度正好占满画面。实际上完全按照该要求拍摄有一定难度,因此也可拍摄的稍小。此时,将乘以“整个画面的垂直像素/画面中图表的每有效高度的像素数”进行标定。 7、相机条件设定的原则:根据本标准测量分辨率时,相机参数原则上采用出厂时的 设定。采用出厂设定以外的设定进行测量时必须注明所采用的设定。若存在根据出厂时的设定无法确定的参数时,厂商将按照该相机的用户最可能使用的设定进行测量,并注明可确定该设定的信息。曝光条件、对焦、变焦位臵没有特别规定;相机的白平衡必须相对照明光源进行适当调节。 8、测试图卡照明方法图示:

基于摄像头的图像采集与处理应用

基于摄像头的图像采集与处理应用 1、摄像头工作原理 图像传感器,是组成数字摄像头的重要组成部分。根据元件的材料不同,可分为CCD (Charge Coupled Device,电荷耦合元件)和CMOS(Complementary Metal-Oxide Semiconductor,金属氧化物半导体元件)两大类。 电荷藕合器件图像传感器CCD(Charge Coupled Device),它使用一种高感光度的半导体材料制成,能把光线转变成电荷,通过模数转换器芯片转换成数字信号,数字信号经过压缩以后由相机内部的闪速存储器或内置硬盘卡保存,因而可以轻而易举地把数据传输给计算机,并借助于计算机的处理手段,根据需要和想像来修改图像。CCD由许多感光单位组成,通常以百万像素为单位。当CCD表面受到光线照射时,每个感光单位会将电荷反映在组件上,所有的感光单位所产生的信号加在一起,就构成了一幅完整的画面。 互补性氧化金属半导体CMOS(Complementary Metal-Oxide Semiconductor)和CCD一样同为在图像传感器中可记录光线变化的半导体。CMOS主要是利用硅和锗这两种元素所做成的半导体,使其在CMOS上共存着带N(带–电)和P(带+电)级的半导体,这两个互补效应所产生的电流即可被处理芯片纪录和解读成影像。然而,CMOS的缺点就是太容易出现杂点, 这主要是因为早期的设计使CMOS在处理快速变化的影像时,由于电流变化过于频繁而会产生过热的现象。 CCD和CMOS在制造上的主要区别是CCD是集成在半导体单晶材料上,而CMOS是集成在被称做金属氧化物的半导体材料上,工作原理没有本质的区别。CCD制造工艺较复杂,采用CCD的摄像头价格都会相对比较贵。事实上经过技术改造,目前CCD和CMOS的实际效果的差距已经减小了不少。而且CMOS的制造成本和功耗都要低于CCD不少,所以很多摄像头生产厂商采用的CMOS感光元件。成像方面:在相同像素下CCD的成像通透性、明锐度都很好,色彩还原、曝光可以保证基本准确。而CMOS的产品往往通透性一般,对实物的色彩还原能力偏弱,曝光也都不太好,由于自身物理特性的原因,CMOS的成像质量和CCD还是有一定距离的。但由于低廉的价格以及高度的整合性,因此在摄像头领域还是得到了广泛的应用 工作原理:为了方便大家理解,我们拿人的眼睛来打个比方。当光线照射景物,景物上的光线反射通过人的晶状体聚焦,在视网膜上就可以形成图像,然后视网膜的神经感知到图像将信息传到大脑,我们就能看见东西了。摄像头成像的原理和这个过程非常相似,光线照射景物,景物上的光线反射通过镜头聚焦,图像传感器就会感知到图像。 具体部分是这样的,摄像头按一定的分辨率,以隔行扫描的方式采集图像上的点,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成与灰度一一对应的电压值,然后将此电压值通过视频信号端输出。如图1所示,摄像头连续地扫描图像上的一行,则输出

摄像头图像采集及处理范文

摄像头采集赛道黑线信息是本系统赛道信息获取的主要途径,本章将从摄像头工作原理、图像采样电路设计、和采样程序流程图三个方面进行介绍。 8.1 摄像头工作原理摄像头常分为彩色和黑白两种摄像头,主要工作原理是:按一定的分辨率,以隔行扫描的方式采样图像上的点,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成与灰度成一一对应关系的电压值,然后将此电压值通过视频信号端输出。 在示波器上观察可知摄像头信号如图8.1所示。摄像头连续地扫描图像上的一行,就输出一段连续的电压视频信号,该电压信号的高低起伏正反映了该行图像的灰度变化情况。当扫描完一行,视频信号端就输出一低于最低视频信号电压的电平(如0.3V),并保持一段时间。这样相当于,紧接着每行图像对应的电压信号之后会有一个电压“凹槽”,此“凹槽”叫做行同步脉冲,它是扫描换行的标志。然后,跳过一行后(因为摄像头是隔行扫描的方式),开始扫描新的一行,如此下去,直到扫描完该场的视频信号,接着就会出现一段场消隐区。此区中有若干个复合消隐脉冲(简称消隐脉冲),在这些消隐脉冲中,有个脉冲,它远宽于(即持续时间长于)其他的消隐脉冲,该消隐脉冲又称为场同步脉冲,它是扫描换场的标志。场同步脉冲标志着新的一场的到来,不过,场消隐区恰好跨在上一场的结尾部分和下一场的开始部分,得等场消隐区过去,下一场的视频信号才真正到来。摄像头每秒扫描25 幅图像,每幅又分奇、偶两场,先奇场后偶场,故每秒扫描50 场图像。奇场时只扫描图像中的奇数行,偶场时则只扫描偶数行。 8.2 图像采样电路设计在本次比赛中赛道仅由黑白两色组成,为了获得赛道特征,只需提取探测画面的灰度信息,而不必提取其色彩信息,所以本设计中采用黑白摄像头。型号为: XB-2001B,分辨率为320*240。为了有效地获取摄像头的视频信号,我们采用LM1881提取行同步脉冲,消隐脉冲和场同步脉冲,电路原理图8.2所示。将视频信号通过一个电容接至LM1881的2脚,即可得到控制单片机进行A/D采样的控制信号行同步HS与奇偶场同步号 ODD/EVEN。

单片机摄像头数据采集与处理

单片机摄像头数据采集与处理 题目单片机摄像头数据采集与处理 _自动化学院_院(系) 自动化_专业学 号 08009123 姓名孙博指导教师符影杰顾问教师起止日期 2012.12.20 –2013.06.10 设计地点中心楼 224东南大学毕业设计(论文)报告摘要单片机摄像 头数据采集与处理摘要随着计算机的发展,随着图像采集处理技术的进步和社会 的发展,其被广泛的运用于社会社交,远程医疗及实时监控等各个方面。图像测量 是一种非接触式的检测方法,可应用于工业、民用等许多领域。图像采集与处理是 图像测量的基础,关系到测量的精度与速度。基于单片机摄像头图像采集与处理技 术拥有广泛的应用市场和广阔的发展前景。本文中基于低功耗单片机的摄像式实时 图像测量系统,通过图像测量的方法,可直接安装在常规电表前,采用摄像技术和 图像识别技术实现数据采集,将读表数据直接在单片机中处理并显示出结果,采用 串口传输技术将数据存储于上位机上并显示,无需人工干预,具有成本低、安装简

单、智能化程度高的特点。针对本设计的特点,采用一种基于图像处理技术 的数码 管检测系统,设计了静态图像采集和静态图像处理的控制方案。首先,通过分析与 实验,完成各功能模块核心元件的选型与外围电路设计。经过硬件调试,完成了最 小系统、图像采集、数据存储、结果显示和数据传输等功能模块的硬件设计。其次, 在硬件平台的基础上,实现各个功能模块的软件功能。基于本装置的 控制 要求,分别选用了 MSP430F149 单片机和STC12LE5A60S2 单片机和OV7670 图像传感器作为核心部件,设计并完成了两套图像测量系统。实验结 果表 明,该装置满足测量要求,达到了研究的预期目的。关键词:图像测量、图像 处理、 摄像头、单片机 .I.东南大学毕业设计(论文)报告 Abstract Singlechip camera data acquisition and processing Abstract With the development of computer technology along with the development of image acquisition andprocessing technology and the progress of society image technology is widely used in socialnetworkingtelemedicine and real-time monitoring. Image measurement is a sort of non-contactmeasurement which can be applied to many fields such as industrial civil. Image acquisition andprocessing is the basis of image measurement which is related to the precision and

摄像头视频采集压缩及传输原理

摄像头视频采集压缩及传输原理 摄像头基本的功能还是视频传输,那么它是依靠怎样的原理来实现的呢?所谓视频传输:就是将图片一张张传到屏幕,由于传输速度很快,所以可以让大家看到连续动态的画面,就像放电影一样。一般当画面的传输数量达到每秒24帧时,画面就有了连续性。 下边我们将介绍摄像头视频采集压缩及传输的整个过程。 一.摄像头的工作原理(获取视频数据) 摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过USB接口传输到电脑中处理,通过显示器就可以看到图像了。下图是摄像头工作的流程图: 注1:图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。 注2:数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。 DSP结构框架: 1. ISP(image signal processor)(镜像信号处理器) 2. JPEG encoder(JPEG图像解码器) 3. USB device controller(USB设备控制器) 而视频要求将获取的视频图像通过互联网传送到异地的电脑上显示出来这其中就涉及到对于获得的视频图像的传输。 在进行这种图片的传输时,必须将图片进行压缩,一般压缩方式有如H.261、JPEG、MPEG 等,否则传输所需的带宽会变得很大。大家用RealPlayer不知是否留意,当播放电影的时候,在播放器的下方会有一个传输速度250kbps、400kbps、1000kbps…画面的质量越高,这个速度也就越大。而摄像头进行视频传输也是这个原理,如果将摄像头的分辨率调到640×480,捕捉到的图片每张大小约为50kb左右,每秒30帧,那么摄像头传输视频所需的速度为50×30/s=1500kbps=1.5Mbps。而在实际生活中,人们一般用于网络视频聊天时的分辨率为320×240甚至更低,传输的帧数为每秒24帧。换言之,此时视频传输速率将不到300kbps,人们就可以进行较为流畅的视频传输聊天。如果采用更高的压缩视频方式,如MPEG-1等等,可以将传输速率降低到200kbps不到。这个就是一般视频聊天时,摄像头所需的网络传输速度。 二.视频压缩部分 视频的压缩是视频处理的核心,按照是否实时性可以分为非实时压缩和实时压缩。而视频传输(如QQ视频即时聊天)属于要求视频压缩为实时压缩。 下面对于视频为什么能压缩进行说明。 视频压缩是有损压缩,一般说来,视频压缩的压缩率都很高,能够做到这么 高的压缩率是因为视频图像有着非常大的时间和空间的冗余度。所谓的时间冗余度指的是两帧相邻的图像他们相同位置的像素值比较类似,具有很大的相关性,尤其是静止图像,甚至两帧图像完全相同,对运动图像,通过某种运算(运动估计),应该说他们也具有很高的相关性;而空间相关性指的是同一帧图像,相邻的两个像素也具备一定的相关性。这些相关性

摄像头基础知识介绍

一、摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像。 数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。DSP结构框架: 1. ISP(image signal processor)(镜像信号处理器) 2. JPEG encoder(JPEG图像解码器) 3. USB device controller(USB设备控制器) 常见的摄像头传感器类型主要有两种, 一种是CCD传感器(Chagre Couled Device),即电荷耦合器。 一种是CMOS传感器(Complementary Metal-Oxide Semiconductor)即互补性金属氧化物半导体。 CCD的优势在于成像质量好,但是制造工艺复杂,成本高昂,且耗电高。在相同分辨率下,CMOS价格比CCD便宜,但图像质量相比CCD来说要低一些。CMOS影像传感器相对CCD具有耗电低的优势,加上随着工艺技术的进步,CMOS的画质水平也不断地在提高,所以目前市面上的手机摄像头都采用CMOS传感器。

手机摄像头的简单结构 滤光片有两大功用: 1.滤除红外线。滤除对可见光有干扰的红外光,使成像效果更清晰。 2.修整进来的光线。感光芯片由感光体(CELL)构成,最好的光线是直射进来,但为了怕干扰到邻近感光体,就需要对光线加以修整,因此那片滤光片不是玻璃,而是石英片,利用石英的物理偏光特性,把进来的光线,保留直射部份,反射掉斜射部份,避免去影响旁边的感光点. 二、相关参数和名词 1、常见图像格式 1.1 RGB格式: 传统的红绿蓝格式,比如RGB565,RGB888,其16-bit数据格式为5-bit R + 6-bit G + 5-bit B。G多一位,原因是人眼对绿色比较敏感。 1.2 YUV格式: luma (Y) + chroma (UV) 格式。YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。 色度(UV)定义了颜色的两个方面─色调与饱和度,分别用CB和CR表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。 主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。 1.3 RAW data格式: RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称

图像采集处理模块

1、图像采集处理 我们将OpenCV软件安装在安卓手机中,对手机拍照后的图像进行辨别处理以及定位处理,通过蓝牙模块,将信号传给单片机。 示意图: (1)、利用手机进行拍照、识别的原因: 我们查阅相关资料,找到了蓝牙助手v1.0这个软件,它是一款手机软件,实现了对于安卓手机蓝牙的基本操作以及安卓手机与单片机的通信。安装了次软件的安卓手机就可以借助HC-05蓝牙串口模块,控制单片机等系统,并可以接受从单片机等传送来的数据。 利用这个软件的原因是因为此软完成了蓝牙串口协议的设置,开发者使用时可以免去复杂的设置。 (2)、所用设备HC-05蓝牙串口 实物图:

模块与单片机的连接方式: 参数设置: 工作模式:从模式;波特率:9600bps;设备名称:HC-05;配对密码:1234,如按默认参数则无需以下个性设置。所有设置好的参数掉电都可保存): 1)、给模块提供合适的工作电源,带底板模块的工作电源为3.6~6V,不带底板核心模块为3.3V 2)、正确连接数据线,单片机的TXD和RXD必须与蓝牙模块的RXD,TXD交叉连接 进入AT命令模式有两种方法: a.蓝牙模块工作后拉高KEY脚电平进入AT模式1,LED状态为快闪,此时设置AT命令使用的波特率与通信时波特率一致,如通信时使用9600则此时设置AT命令的波特率

也应该选择9600 b.在模块上电的同时也令KEY脚为高电平,则进入AT模式2,LED状态为慢闪,固定使用38400,8,N,1的通信格式设置参数进入AT模式后只有保持KEY脚为高电平才能使用全部的AT命令。AT命令后面必须有回车换行符。如果使用SSCOM则在字符串输入框输入“AT”并勾选“发送新行”即可。 (3)、手机与蓝牙从机模块的连接及通信测试: 首先打开手机蓝牙,然后用手机的蓝牙管理程序扫描蓝牙设备,这时会找到蓝牙从机模块,然后进入蓝牙助手v1.0这个软件,在此软件中再次查询蓝牙从机模块,这时点击连接,会提示输入密码,例如模块初始配对码为1234。输入后,会提示配对未连接。此操作只要进行一次即可被手机记住,下次自动配对。因为蓝牙设备是串口设备,需要打开端口才可以连接,这时模块的灯还是闪烁的,当你打开端口后,灯才会变成连接成功状态。 下一步进行测试,在蓝牙助手v1.0中,输入字符后点击send,这时数据就会通过蓝牙发送到蓝牙模块,并从模块的TXD发出,此时单片机连接到模块的TXD-RXD进行数据通信了。 (4)、如何利用opencv软件进行物体的识别区分以及定位 识别特定的物体,可以用模板匹配的方法,大致说来就是先拍一张模板,再在图像里检测目标,模板匹配对比的是图像的像素值。 我们设想的具体方式为: 1)、在比赛前,分别拍摄架子上的物品(第一层和第二层),作为OpenCV图像库中的模版图像(patch);(其角度为正面照,若增强其区分的精确度,则可多角度完成一个物品的模版照) 2)在机器人启动前,我们将要拿去的东西输入进机器人; 3)、寻找一幅图像的匹配的模板,OpenCV已经为我们集成好了相关的功能,具体函数为matchTemplate; 4)、比赛时在现场分5次拍摄图像(每四个物品一次拍成),最中间无巡线部分,采用相隔1S的时间段的频率进行拍摄,知道拍摄出的图片物品在正中间即可,这就确定了物品的位置。 5)、接下来就是在所拍摄的图像中寻找和模板图像(patch)最相似的区域。OpenCV提供给我们的函数matchTemplate。该函数的功能为,在输入源图像Source image(I)中滑动框,寻找各个位置与模板图像Template image(T)的相似度,并将结果保存在结果矩阵result matrix(R)中。该矩阵的每一个点的亮度表示与模板T的匹配程度。然后可以通过函数minMaxLoc定位矩阵R中的最大值; 6)、手机根据找到的物体的位置,生成指令,并通过串口传递给单片机,最后机器人则针对匹配度最高的物品进行拿取操作。 通过查找资料,OpenCV的函数库中能够应用于匹配的方法有一下几种: CV_TM_SQDIFF 平方差匹配法,最好的匹配为0,值越大匹配越差 CV_TM_SQDIFF_NORMED 归一化平方差匹配法

基于单片机的图像处理采集系统

( 二 〇 一 二 年 六 月 本科毕业设计说明书 题 目:基于单片机的图像处理采集系统设 计与实现 学生姓名: 学 院: 系 别: 专 业: 班 级: 指导教师:

摘要 传统的工业级图像处理采集系统大多是由CCD摄像头、图像采集卡和PC机组成,虽已得到了广泛的应用,但是它具有结构复杂,成本高,体积大,功耗大等缺点。随着单片机的迅速发展,开发一种智能控制及智能处理功能的微型图像处理采集系统成为可能,并且也克服了传统图像处理采集系统的诸多缺点。 本设计提出了基于单片机的图像采集系统,该系统主要由四大模块组成:第一个是单片机控制模块,对摄像头进行控制;第二个是摄像头模块,即进行图像拍摄和取图;第三个是Zigbee无线传输模块,功能是将图像传送到上位机;最后是上位机,实现图像显示功能。其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高,使用环境广泛及成本低等。利用Proteus和Keil进行仿真调试,可以看到设计内容的运行结果,验证系统运的行正确及稳定性,并且实现了图像处理采集功能,所以具有一定的实用和参考价值。 关键词:单片机;Proteus;图像采集

Abstract The traditional industrial image processing collection system by CCD camera, mostly image collection card and PC unit into, although already a wide range of applications, but it has the structure is complex, high cost, big volume and shortcomings, such as big power consumption. With the rapid development of the single chip microcomputer, the development of a kind of intelligent control and intelligent processing function of micro image processing collection system possible, and also overcome traditional image processing collection system of many of the faults. This design is put forward based on SCM image acquisition system, the system consists of four modules: the first one is the single chip microcomputer control module, the camera to control; The second is a camera module, the image shoot and take diagram; The third is Zigbee wireless transmission module, the function is will images to PC; Finally the PC, realize image display function. Its advantage is hardware circuit is simple, software perfect function, control system and reliable, high cost performance, use extensive and environment cost low status. Use Proteus and Keil simulation commissioning, can see the operation of the design content, as demonstrated the correct and do the system stability, and realize the image processing collection function, so has certain practical and reference value. Keywords:Single-Chip Microcomputer;Proteus; Image Capture

相关主题
文本预览
相关文档 最新文档