① c語言進行攝像頭編程需要學些什麼
directshow/avicapture/opencv幾種都可以實現,好好學這幾方面吧 ,不對,弄清楚其中一種先。但是,基本語法知識就有點...C知識先搞清楚。
② 如何實現在電腦上編程實現對攝像頭的控制
你說的是對對方的攝像頭進行控制嗎?
這個常人做不到的 因為你要建立一個連接,也就相當於你是伺服器,你還得打開一個通往他的埠,還要越過對方的防火牆和殺毒軟體
你如果沒有C++基礎可以用易語言弄,不過太麻煩了
③ C#捕捉無線網路攝像頭如何實現呢
無線攝像頭品牌是否有可編程介面 API 有的話參照下就容易了.
沒有的話既然是無線攝像頭通過WIFI傳輸她一定有PC端的.你可以分析他的封包,或者分析他的客戶端自己寫代碼也可以實現.
④ c# 攝像頭編程
建議你使用AVICap class API(avicap32.dll)來進行攝像頭編程,你用的是.net,所以請使用平台Invoke(P/Invoke)來使用該API.
給你點相關代碼:
1.
using System.Runtime.InteropServices;
2.
const int WM_CAP_START = 1024;
const int WS_CHILD = 1073741824;
const int WS_VISIBLE = 268435456;
const int WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);
const int WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11);
const int WM_CAP_EDIT_COPY = (WM_CAP_START + 30);
const int WM_CAP_SEQUENCE = (WM_CAP_START + 62);
const int WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23);
const int WM_CAP_SET_SCALE = (WM_CAP_START + 53);
const int WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52);
const int WM_CAP_SET_PREVIEW = (WM_CAP_START + 50);
const int SWP_NOMOVE = 2;
const int SWP_NOSIZE = 1;
const int SWP_NOZORDER = 4;
const int HWND_BOTTOM = 1;
3.
//---capGetDriverDescription函數取得捕獲驅動的版本描述信息 [System.Runtime.InteropServices.DllImport("avicap32.dll")]
static extern bool capGetDriverDescriptionA(
short wDriverIndex, string lpszName,
int cbName, string lpszVer, int cbVer);
//---capCreateCaptureWindow函數建立一個捕獲窗口
[System.Runtime.InteropServices.DllImport("avicap32.dll")]
static extern int capCreateCaptureWindowA(
string lpszWindowName, int dwStyle, int x, int y,
int nWidth, short nHeight, int hWnd, int nID);
//---SendMessageA
[System.Runtime.InteropServices.DllImport(
"user32", EntryPoint = "SendMessageA")]
static extern int SendMessage(
int hwnd, int Msg, int wParam,
[MarshalAs(UnmanagedType.AsAny)] object lParam);
//---SetWindowPos
[System.Runtime.InteropServices.DllImport(
"user32", EntryPoint = "SetWindowPos")]
static extern int SetWindowPos(
int hwnd, int hWndInsertAfter, int x, int y,
int cx, int cy, int wFlags);
//--DestroyWindow
[System.Runtime.InteropServices.DllImport("user32")]
static extern bool DestroyWindow(int hndw);
4.
//---定義窗口句柄---
private int hWnd;
5.
private void Form1_Load(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
try
{
//---配置串口參數
serialPort.PortName = "COM3";
serialPort.BaudRate = 9600;
serialPort.Parity = System.IO.Ports.Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = System.IO.Ports.StopBits.One;
serialPort.Handshake = System.IO.Ports.Handshake.None;
serialPort.DataReceived +=
new
System.IO.Ports.(
DataReceived);
//打開串口
serialPort.Open();
serialPort.DiscardInBuffer();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
//視頻顯示
PreviewVideo(PictureBox1);
}
6.
private void PreviewVideo(PictureBox pbCtrl)
{
hWnd = capCreateCaptureWindowA(
"0", WS_VISIBLE | WS_CHILD, 0, 0, 0, 0,
pbCtrl.Handle.ToInt32(), 0);
if (SendMessage(hWnd, WM_CAP_DRIVER_CONNECT, 0, 0) != 0)
{
//---set the preview scale---
SendMessage(hWnd, WM_CAP_SET_SCALE, 1, 0);
//---set the preview rate (ms)---
SendMessage(hWnd, WM_CAP_SET_PREVIEWRATE, 30, 0);
//---start previewing the image---
SendMessage(hWnd, WM_CAP_SET_PREVIEW, 1, 0);
//---resize window to fit in PictureBox control---
SetWindowPos(hWnd, HWND_BOTTOM, 0, 0,
pbCtrl.Width, pbCtrl.Height,
SWP_NOMOVE | SWP_NOZORDER);
}
else
{
//錯誤連接
DestroyWindow(hWnd);
}
}
⑤ 如何編程使網路攝像頭監測有東西在移動
這應該說圖像檢測和處理的內容。很多圖書把它歸為人工智慧的范疇。
我有一個思路供你參考。
如果攝像頭是固定的話,那它拍攝的背景是相同的。
攝像機就是連續快速拍攝的照相機。
攝像頭以每秒若干張照片的速度拍攝。
這些照片顯示的應該是連續的畫面。
而檢測畫面是否在運動,就是比較前後兩張圖片是否存在差異。
以上是基本思路,程序可以直接從攝像頭上獲取圖像信息,也可從視頻文件中獲取圖像信息。
不過在實際實現上還是有改進的地方,
比如是檢測前後兩張圖片的話,檢測的敏感程度太高了。
比如,攝像頭前飛來一隻蚊子,它也能察覺到,而你也許只想看到是否有人或車輛在動。或者背景上有一些植物在動,而這不是你需要。
可以對這個規則進行適當修改。
比如檢測前後連續若干張圖片,如果圖片的差異度不大的話,算做沒有差異。
以及兩張圖片之間的差異度如何計算都可以適當規定。
⑥ linux下怎麼樣進行攝像頭編程
在linux下所有設備都是文件。所以對攝像頭的操作其實就是對文件的操作。USB攝像頭的設備文件就是在/dev目錄下的video0(假如只有一個攝像頭)。在linux下操作攝像頭就是使用v4l2對攝像頭進行的操作,操作步驟如下
打開設備文件。
int fd=open(」/dev/video0″,O_RDWR);
2. 取得設備的capability,看看設備具有什麼功能,比如是否具有輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capability
v4l2_std_id std;
do {
ret= ioctl(fd, VIDIOC_QUERYSTD, std);
} while (ret == -1 errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
3. 選擇輸入,一個設備可以有多個輸入。VIDIOC_S_INPUT,struct v4l2_input(可不要)
4. 設置的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
struct v4l2_format fmt;
memset ( fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
if (ioctl(fd, VIDIOC_S_FMT, fmt) < 0)
{
printf("set format failed ");
//return 0;
}
5. 向驅動申請幀緩沖,一般不超過5個。struct v4l2_requestbuffers
struct v4l2_requestbuffers req;
memset(req, 0, sizeof (req));
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (ioctl(fd,VIDIOC_REQBUFS,req) == -1)
{
perror("VIDIOC_REQBUFS error ");
//return -1;
}
6.申請物理內存
將申請到的幀緩沖映射到用戶空間,這樣就可以直接操作採集到的幀了,而不必去復制。將申請到的幀緩沖全部入隊列,以便存放採集到的數據.VIDIOC_QBUF,struct v4l2_buffer
VideoBuffer* buffers = calloc( req.count, sizeof(VideoBuffer) );
printf("sizeof(VideoBuffer) is %d ",sizeof(VideoBuffer));
struct v4l2_buffer buf;
for (numBufs = 0; numBufs < req.count; numBufs++)
{
memset( buf, 0, sizeof(buf) );
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = numBufs;
if (ioctl(fd, VIDIOC_QUERYBUF, buf) < 0)
{
printf("VIDIOC_QUERYBUF error ");
//return -1;
}
printf("buf len is %d ",sizeof(buf));
//內存映射
buffers[numBufs].length = buf.length;
buffers[numBufs].offset = (size_t) buf.m.offset;
buffers[numBufs].start = mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
printf("buffers.length = %d,buffers.offset = %d ,buffers.start[0] = %d ",buffers[numBufs].length,buffers[numBufs].offset,buffers[numBufs].start[0]);
printf("buf2 len is %d ",sizeof(buffers[numBufs].start));
if (buffers[numBufs].start == MAP_FAILED)
{
perror("buffers error ");
//return -1;
}
if (ioctl (fd, VIDIOC_QBUF, buf) < 0)
{
printf("VIDIOC_QBUF error ");
//return -1;
}
}
7. 開始的採集。
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (fd, VIDIOC_STREAMON, type) < 0)
{
printf("VIDIOC_STREAMON error ");
// return -1;
}
8. 出隊列以取得已採集數據的幀緩沖,取得原始採集數據。VIDIOC_DQBUF, 將緩沖重新入隊列尾,這樣可以循環採集。VIDIOC_QBUF
if (ioctl(fd, VIDIOC_DQBUF, buf) < 0)
{
perror("VIDIOC_DQBUF failed. ");
//return -1;
}
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
unsigned char *ptcur = buffers[numBufs].start;
DEBUG("buf.bytesused = %d ",buf.bytesused);
int i1;
for(i1=0; i1<buf.bytesused; i1++)
{
if((buffers[numBufs].start[i1] == 0xFF) (buffers[numBufs].start[i1+1] == 0xC4))
{
DEBUG("huffman table finded! buf.bytesused = %d FFC4 = %d ",buf.bytesused,i1);
break;
}
}
if(i1 == buf.bytesused)printf("huffman table don't exist! ");
int i;
for(i=0; i<buf.bytesused; i++)
{
if((buffers[numBufs].start[i] == 0xFF) (buffers[numBufs].start[i+1] == 0xD8)) break;
ptcur++;
}
DEBUG("i=%d,FF=%02x,D8=%02x ",i,buffers[numBufs].start[i],buffers[numBufs].start[i+1]);
int imagesize =buf.bytesused - i;
DEBUG("buf.bytesused = %d ",buf.bytesused);
DEBUG ("imagesize = %d ",imagesize);
9. 停止的採集。VIDIOC_STREAMOFF
10. 關閉設備。close(fd);
⑦ ip攝像頭編程
根據你提供的幾個 dll,感覺你是在進行usb攝像頭的編程,而非IP攝像頭。
對嗎?
如果確是IP頭,是什麼牌子的
⑧ 在編程中怎樣調用攝像頭
在編程裡面想要調用了攝像頭的話,這個你可以給他編輯一個程序,然後就打開攝像頭就可以了。
⑨ 如何通過Android手機編程實現 通過IP訪問網路攝像頭 把視頻顯示在安卓手機上 求高人指點
找產商要攝像頭的sdk
⑩ linux下怎樣進行攝像頭編程
在linux下所有設備都是文件。所以對攝像頭的操作其實就是對文件的操作。USB攝像頭的設備文件就是在/dev目錄下的video0(假如只有一個攝像頭)。在linux下操作攝像頭就是使用v4l2對攝像頭進行的操作,操作步驟如下
打開設備文件。
int fd=open(」/dev/video0″,O_RDWR);
2. 取得設備的capability,看看設備具有什麼功能,比如是否具有輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capability
v4l2_std_id std;
do {
ret= ioctl(fd, VIDIOC_QUERYSTD, std);
} while (ret == -1 errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
3. 選擇輸入,一個設備可以有多個輸入。VIDIOC_S_INPUT,struct v4l2_input(可不要)
4. 設置的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
struct v4l2_format fmt;
memset ( fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
if (ioctl(fd, VIDIOC_S_FMT, fmt) < 0)
{
printf("set format failed ");
//return 0;
}
5. 向驅動申請幀緩沖,一般不超過5個。struct v4l2_requestbuffers
struct v4l2_requestbuffers req;
memset(req, 0, sizeof (req));
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (ioctl(fd,VIDIOC_REQBUFS,req) == -1)
{
perror("VIDIOC_REQBUFS error ");
//return -1;
}
6.申請物理內存
將申請到的幀緩沖映射到用戶空間,這樣就可以直接操作採集到的幀了,而不必去復制。將申請到的幀緩沖全部入隊列,以便存放採集到的數據.VIDIOC_QBUF,struct v4l2_buffer
VideoBuffer* buffers = calloc( req.count, sizeof(VideoBuffer) );
printf("sizeof(VideoBuffer) is %d ",sizeof(VideoBuffer));
struct v4l2_buffer buf;
for (numBufs = 0; numBufs < req.count; numBufs++)
{
memset( buf, 0, sizeof(buf) );
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = numBufs;
if (ioctl(fd, VIDIOC_QUERYBUF, buf) < 0)
{
printf("VIDIOC_QUERYBUF error ");
//return -1;
}
printf("buf len is %d ",sizeof(buf));
//內存映射
buffers[numBufs].length = buf.length;
buffers[numBufs].offset = (size_t) buf.m.offset;
buffers[numBufs].start = mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
printf("buffers.length = %d,buffers.offset = %d ,buffers.start[0] = %d ",buffers[numBufs].length,buffers[numBufs].offset,buffers[numBufs].start[0]);
printf("buf2 len is %d ",sizeof(buffers[numBufs].start));
if (buffers[numBufs].start == MAP_FAILED)
{
perror("buffers error ");
//return -1;
}
if (ioctl (fd, VIDIOC_QBUF, buf) < 0)
{
printf("VIDIOC_QBUF error ");
//return -1;
}
}
7. 開始的採集。
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (fd, VIDIOC_STREAMON, type) < 0)
{
printf("VIDIOC_STREAMON error ");
// return -1;
}
8. 出隊列以取得已採集數據的幀緩沖,取得原始採集數據。VIDIOC_DQBUF, 將緩沖重新入隊列尾,這樣可以循環採集。VIDIOC_QBUF
if (ioctl(fd, VIDIOC_DQBUF, buf) < 0)
{
perror("VIDIOC_DQBUF failed. ");
//return -1;
}
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
unsigned char *ptcur = buffers[numBufs].start;
DEBUG("buf.bytesused = %d ",buf.bytesused);
int i1;
for(i1=0; i1<buf.bytesused; i1++)
{
if((buffers[numBufs].start[i1] == 0xFF) (buffers[numBufs].start[i1+1] == 0xC4))
{
DEBUG("huffman table finded! buf.bytesused = %d FFC4 = %d ",buf.bytesused,i1);
break;
}
}
if(i1 == buf.bytesused)printf("huffman table don't exist! ");
int i;
for(i=0; i<buf.bytesused; i++)
{
if((buffers[numBufs].start[i] == 0xFF) (buffers[numBufs].start[i+1] == 0xD8)) break;
ptcur++;
}
DEBUG("i=%d,FF=%02x,D8=%02x ",i,buffers[numBufs].start[i],buffers[numBufs].start[i+1]);
int imagesize =buf.bytesused - i;
DEBUG("buf.bytesused = %d ",buf.bytesused);
DEBUG ("imagesize = %d ",imagesize);
9. 停止的採集。VIDIOC_STREAMOFF
10. 關閉設備。close(fd);