Ключевые слова:hardware, linux, (найти похожие документы)
From: kav <kav@uriit.ru.>
Newsgroups: email
Date: Mon, 5 Oct 2006 14:31:37 +0000 (UTC)
Subject: Подключаем Genius VideoCAM Look.
В связи с тем что в сети не было найдено софта который бы корректно
работал с данной web-камерой была предпринята попытка всё таки
опубликовать данные с камеры в WEB.
Имеем:
web-камеру на чипе sn9c10х (VideoCAM Look)
fedore core 5 c штатным ядром 2.6.16_2080
Необходимо осуществить захват и опубликовать изображение с камеры в WEB
Подготовка:
1)скачиваем с сети обновленную версию драйвера sn9c102 (в моём случае
это 1.32, как показала практика штатный драйвер более низкой верии
работает с камерой не совсем корректно)
2)скачиваем программку sn-webcam (из нее нам потребуются алгоритмы
декомпрессии Хафмана и Байера rggb)
На этом подготовка завершена.
Этап 1
------
Установка более новой версии драйвера
Распаковываем файл с исходными текстами драйвера и выполняем в каталоге,
в котором лежит Makefile команду:
make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd`
Далее копируем полученный модуль драйвера поверх старого и выполняем
команду moddep.
Теперь подключаем камеру к компьютеру и видим в dmesg что найдена камера
и файл устройства для нее /dev/video0
На этом установка нового драйвера завершена.
Этап 2
------
Пишем программку которая будет осуществлять захват картинки и
отправлять ее по фтп на web-сервер.
1)Создаём каталог в котором будет собираться и запускаться наша
программа и далее работаем с ним.
2)Создаём Makefile:
capt: capt.c
gcc -ljpeg capt.c sonix_compress.c bayer.c -o capt
3)Создаём файлик capt.c:
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>
/* These are needed to use the Videum driver */
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/videodev.h> /* Video for Linux Two */
#include <jpeglib.h>
int main(int argc,char** argv){
struct v4l2_capability cap;
struct v4l2_fmtdesc fmt;
int vid=open("/dev/video0",O_RDONLY);
if(vid<0){
printf("Cant open device\n");
exit(1);
}
int err=ioctl(vid,VIDIOC_QUERYCAP, &cap);
if(err){
printf("error getting capabilities\n");
exit(1);
}
if(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE){
printf("We can capture\n");
}
if(cap.capabilities & V4L2_CAP_READWRITE){
printf("We can read\n");
}
int x=640;
int y=480;
struct v4l2_format format;
format.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
format.fmt.pix.width=x;
format.fmt.pix.height=y;
format.fmt.pix.pixelformat=V4L2_PIX_FMT_SN9C10X;
struct v4l2_cropcap cropcap;
cropcap.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
err=ioctl(vid,VIDIOC_CROPCAP,&cropcap);
if(err){
printf("error getting cropcap\n");
exit(1);
}
struct v4l2_crop crop;
crop.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c.top=0;
crop.c.left=0;
crop.c.width=x*24;
crop.c.height=y*24;
err=ioctl(vid,VIDIOC_S_CROP,&crop);
if(err){
printf("error setting crop\n");
exit(1);
}
err=ioctl(vid,VIDIOC_S_FMT,&format);
if(err){
printf("error seting format\n");
exit(1);
}
printf("imagesize: %i bytesperline %i\n",format.fmt.pix.sizeimage,format.fmt.pix.bytesperline);
char *s = (char *) malloc (x * y);
if (s == NULL)
{
exit (1);
}
char *d = (char *) malloc (x * y * 3);
if (d == NULL)
{
exit (1);
}
char *q = (char *) malloc (x * y * 3);
if (q == NULL)
{
exit (1);
}
int count_=0;
sonix_decompress_init ();
while(1){
err=read(vid,q,x*y);
if(err<0){
printf("error reading image,retry\n");
}
printf("Read %i bytes\n",err);
//decompress
if( sonix_decompress (x, y, q, s)<0){
printf("sonix_error\n");
exit(1);
}
bayer2rgb24 (d, s, x, y);
struct jpeg_compress_struct cinfo;
FILE* outfile;
struct jpeg_error_mgr jerr;
cinfo.err=jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
count_++;
if ((outfile = fopen("out_.jpg", "wb")) == NULL) {
printf( "can't open out_.jpg\n" );
exit(1);
}
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = x; /* image width and height, in pixels */
cinfo.image_height = y;
cinfo.input_components = 3; /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 80, TRUE /* limit to baseline-JPEG values */);
jpeg_start_compress(&cinfo, TRUE);
int row_stride=3*x;
JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = & d[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
system("./ftpcopy.sh");
sleep(1);
}
}
4)Копируем файлы bayer.c, bayer.h, sonix_compress.c, sonix_compress.h в
рабочий каталог
5)Создам файл ftpcopy.sh и устанавливаем на него права на выполнение и
чтение:
#!/bin/sh
ftp -n<script
mv out_.jpg out.jpg
6)создаем файл script:
open www.yourwebserver.ru
user your_user your_password
cd public_html
binary
put out_.jpg
rename out_.jpg out.jpg
by
7)Выполняем команду make и получаем программку capt.
На этом этап 2 закончен.
Этап 3
------
Публикуем полученный результат.
Заходим на web сервер под пользователем your_user
Создаём в домашнем каталоге каталог public_html и в нем index.html
следующего содержания:
<html>
<head>
<title>my web cam</title>
<META HTTP-EQUIV="refresh" content="1"/>
</head>
<body>
<img src=out.jpg>
</body>
</html>
Все готово. Теперь запускаем програмку capt и заходим на сайт http://www.yourwebserver.ru/~your_user/
И радуемся картинке с вашей web камеры.
Извиняюсь за не совсем грамотно написанный код, он писался на коленке)))
Удачи!))