看了好多强文,自己也想像别人一样记录下自己所做的一些工作。在此分享给大家,有错误还请指教!

下面是我用映美精相机在树莓派上的一点摸索。其实也叫不上摸索了,就是照着映美精官网上的指导,一步一步调通而已。闲话不多说了。

首先是按照https://github.com/TheImagingSource/tiscamera/wiki/Raspberry-PI-start上的介绍,在树莓派上装上相机的驱动。但我今天只是完成到,在/dev目录下有video*设备就没再往下了。接着就是运用v4l2来操作相机采集图片,并使用openCV保存采集到的图片。源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <libv4l2.h>
#include <libv4l1.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv/cv.h>

/*
*  A program to capture image via the tis camera.
*  scut Guangzhou #3CITA109
*  2015.5.7
*/

struct buffer {
void   *start;
size_t length;
};

int improcess(void* bstart, __u32 bytesused, int imageWidth, int imageHeight)
{
IplImage* img = cvCreateImageHeader(cvSize(imageWidth,imageHeight), IPL_DEPTH_8U, 1);
// printf("0x%x\n",img->imageData);
// img->imageData=(char*)bstart;
cvSetData(img, bstart, imageWidth);
printf("0x%x\n",img->imageData);
cvSaveImage("single.png", img, 0);
printf("Image is saved!\n");
return 0;
}

#define CLEAR(x) memset(&(x), 0, sizeof(x))

static void xioctl(int fh, int request, void *arg)
{
int r;
do {
r = ioctl(fh, request, arg);
} while (r == -1 && ((errno == EINTR) || (errno == EAGAIN)));

if (r == -1) {
fprintf(stderr, "error %d, %s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
}

int grabberandprocess(char*dev_name, int imageWidth, int imageHeight) {
struct v4l2_format              fmt;
struct v4l2_buffer              buf;
struct v4l2_requestbuffers      req;
enum v4l2_buf_type              type;
fd_set                          fds;
struct timeval                  tv;
int                             r, fd = -1;
unsigned int                    i, n_buffers;
struct buffer                   *buffers;

fd = open(dev_name, O_RDWR | O_NONBLOCK, 0);
if (fd < 0) {
perror("Cannot open device");
exit(EXIT_FAILURE);
}

/* struct v4l2_fmtdesc fmtdesc; 
fmtdesc.index=0; 
fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; 
printf("Support format:\n"); 
while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1) 

printf("\t%d.%s\n",fmtdesc.index+1,fmtdesc.description); 
fmtdesc.index++; 

*/
CLEAR(fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = imageWidth;
fmt.fmt.pix.height = imageHeight;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_GREY;
fmt.fmt.pix.field = V4L2_FIELD_ANY;
xioctl(fd, VIDIOC_S_FMT, &fmt);
if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_GREY)
{
printf("Libv4l didn't accept GREY format. Can't proceed.\n");
exit(EXIT_FAILURE);
}
// else
// printf("set GREY OK!\n");
if ((fmt.fmt.pix.width != imageWidth) || (fmt.fmt.pix.height != imageHeight))
printf("Warning: driver is sending image at %dx%d\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
// else
// printf("set resolution OK!\n");

CLEAR(req);
req.count = 3;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
xioctl(fd, VIDIOC_REQBUFS, &req);

buffers = (buffer*)calloc(req.count, sizeof(*buffers));
for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {
CLEAR(buf);

buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;

xioctl(fd, VIDIOC_QUERYBUF, &buf);

buffers[n_buffers].length = buf.length;
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) {
perror("mmap");
exit(EXIT_FAILURE);
}
xioctl(fd, VIDIOC_QBUF, &buf);
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
xioctl(fd, VIDIOC_STREAMON, &type);

buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;

__u32 shouldused;
shouldused = imageWidth*imageHeight;
do{
xioctl(fd, VIDIOC_DQBUF, &buf);
}while(buf.bytesused != shouldused);

improcess(buffers[buf.index].start, buf.bytesused, imageWidth, imageHeight);

xioctl(fd, VIDIOC_QBUF, &buf);
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
xioctl(fd, VIDIOC_STREAMOFF, &type);
for (i = 0; i < n_buffers; ++i) 
{
munmap(buffers[i].start, buffers[i].length);
}
close(fd);
return 0;
}

int main(int argc, char **argv) {
int imageWidth = 2592;
int imageHeight = 1944;
if (argc == 3) {
//printf("Usage: ./webcam [outputImageWidth] [outputImageHeight]\nE.g. ./webcam 1920 1280\n");
imageWidth = atoi(argv[1]);
imageHeight = atoi(argv[2]);
}
char device[]="/dev/video0";
grabberandprocess(device,imageWidth, imageHeight);
}

在树莓派上编译的Makefile

CC = g++
TARGET = tisgrabber
SRCS = tisgrabber.cpp
OBJS = $(SRCS:.cpp=.o)
DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(DLIBS)  
clean:
rm -rf $(TARGET) $(OBJS)  
%.o:%.cpp
$(CC) -o $@ -c $<

接下来计划加上qt5编的界面,显示采集到的图片和视屏。(待续)

映美精黑白相机在linux平台上的使用(一)相关推荐

  1. GNU/Linux平台上正则表达式的简单使用

    友情提醒:本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux,GNU/grep简称为grep,GNU/sed简称为sed,GNU/gawk简称为awk ...

  2. linux架构接口层教程,在LINUX平台上进行成功实现RIL层功能和框架层应用

    1.课题研究的背景和意义 1.1 Android RIL简介 Android RIL(Radio Interface Layer)提供了无线基带Modem与电话应用之间的抽象层.在Android RI ...

  3. 如何在linux上创建数据库,在LINUX平台上手动创建数据库(oracle 10g)

    在LINUX平台上手动创建数据库(oracle 10g) 安装完oracle软件后,不使用dbca创建数据库,而手动创建数据库,主要目的是了解数据库创建的过程中主要进行了那些操作. 1.首先设置要创建 ...

  4. 用C读取INI配置文件 (可在linux平台上用)

    /*c语言实现,可在linux平台上用了,在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,但是在Linux ...

  5. Linux平台上的音视频互动开发平台

    由于使用习惯,Linux在中国受欢迎程度远不如windows,相应的软件也比较少,尤其是音视频类的软件,但是,这并不代表就完全没有.下面介绍一款强大的音视频即时通讯平台给大家,它就是--Anychat ...

  6. 【DG】在Linux平台上搭建单实例的dataguard--duplicate

    [DG]在Linux平台上搭建单实例的dataguard--duplicate 一 : 实验环境介绍 *** 鉴于生产环境均采用 64 位系统和数据库软件,本实验也将采用这个标准 *** 采用vmwa ...

  7. MySQL在Windows和Linux平台上多版本多实例安装配置方法(5.5、5.6、5.7、8.0)

    MySQL在Windows和Linux平台上多版本多实例安装配置方法(5.5.5.6.5.7.8.0) Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 参考: http:// ...

  8. linux 安装邮件系统,在Linux平台上安装基于Postfix、Courier-imap、Extmail的邮件系统 V 0...

    很久之前就计划写一个Postfix在Linux平台上面的安装文档,把自己安装Postfix的过程总结一下,但由于工作的关系直到现在才动手.和个人的习惯有关,在安装过程中我使用了很多源代码,这对一个新手 ...

  9. Linux平台上直接运行Android应用,手机移动开发技术

    选择安装/卸载 当然选择同意了 下一步 下一步 很快安装成功 安装体验和大多数Windows平台的应用一致. 不过最好安装之前更新一下系统,不然安装过程中也会执行的,偶尔还会出错. ####安装过程中 ...

  10. linux arm 汇编学习,如何在LINUX平台上学习GNU ARM汇编

    本例说明如何在LINUX平台上学习GNU ARM汇编. 1.软件环境 vmware 5.0 + redhat 9.0 + skyeye 1.2.4 + arm-elf 工具 2. 源文件 a.s -- ...

最新文章

  1. 人工智能助力全国大学生智能车竞赛
  2. FPGA开发之RAM IP的使用
  3. 自学python什么时候能够兼职-总结下我是如何利用python在闲余时间月赚5千外快...
  4. 天天象棋 残局闯关 第17关
  5. 计算机网络犯罪和一般犯罪的不同,论计算机网络犯罪题稿.doc
  6. android read设置超时时间,在Android中的BluetoothSocket inputstream.read()中实现超时
  7. 软件工程开发之道:了解能力和复杂度是前提
  8. 前端(jQuery)(10)-- jQuery标签切换
  9. python保留sqrt_python:quot;因式分解quot;引出的知识盲点
  10. [译] 在远程工作中领悟到的 10 件事
  11. PHP最彻底的退出登录,清除session、cookie的代码
  12. 电商项目java经验_分布式电商系统项目总结
  13. Android 开机时间优化
  14. 开发“小米商城官网首页”(静态页面)
  15. cscope.exe程序的base64文本
  16. Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案
  17. Matlab广义追赶法(Thomas法)
  18. [大学物理实验-1]弹簧谐振子实验
  19. MAC MySql 安装(详细步骤)
  20. JavaWeb源码项目蔬菜网上商城+后台管理系统

热门文章

  1. 投影仪与计算机连接方式,投影仪和电脑怎么连接?简单的图文教程
  2. xp计算机找不到音量调节,XP找不到音量控制程序怎么办
  3. USB Server应用于前置机案例分析
  4. 2022国内十大工业级三维视觉引导企业一览
  5. 中间件学习——J2EE中间件四步曲
  6. python爬虫:获取12306网站火车站对应三字码
  7. 配置ouster雷达过程
  8. 如何备考软考中级-系统集成项目管理工程师
  9. javascript用DOM解释XML
  10. Java8实现List转Map