CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 33977|回复: 13

用opencv调用摄像头过程分享

[复制链接]
发表于 2013-9-1 21:04:13 | 显示全部楼层 |阅读模式
环境:CB A10  +  lubuntu1.05 + opencv2.6.4.1

准备:2G以上空闲空间. 直接在CB上编译,交叉编译可参见:移植Qt和OpenCV做图像处理方面的开发中matson的提示
Arm-linux-gnueabihf-
要用硬浮点的compiler
(说明:我没做过交叉编译,因为直接编译成功了。但在CB上直接编译我等了足足2个小时才编译完,可见速度之慢,当然,这与我在SD卡上编译也有关系。SD卡只有1.8G,果断把我坑得好惨,编译到93%的时候空间不足 ,幸好Cmake和make有记忆功能,我把相应文件拷到4G的U盘中,挂载到相同的目录下,直接从93%开始往下编译,还不是很坑。)

个人下载地址:opencv2.6.4.1
官方下载地址:lubuntu1.05 + opencv

主要过程如下:
1. 安装与opencv相关的包和工具
2. make && sudo make install
3. gcc -ggdb `pkg-config --cflags opencv` -o opencv0 opencv0.c `pkg-config --libs opencv`

1. 安装与opencv相关的包和工具:
install.sh
  1. #!/bin/bash

  2. apt-get install build-essential -y
  3. apt-get install cmake -y
  4. apt-get install pkg-config -y
  5. apt-get install libpng12-0 libpng12-dev libpng++-dev libpng3 -y
  6. apt-get install libpnglite-dev libpngwriter0-dev libpngwriter0c2 -y
  7. apt-get install zlib1g-dbg zlib1g zlib1g-dev -y
  8. apt-get install libjasper-dev libjasper-runtime libjasper1 -y
  9. apt-get install pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools -y
  10. apt-get install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-prog -y
  11. apt-get install ffmpeg libavcodec-dev libavcodec52 libavformat52 libavformat-dev -y
  12. apt-get install libgstreamer0.10-0-dbg libgstreamer0.10-0  libgstreamer0.10-dev -y
  13. apt-get install libxine1-ffmpeg  libxine-dev libxine1-bin -y
  14. apt-get install libunicap2 libunicap2-dev -y
  15. apt-get install libdc1394-22-dev libdc1394-22 libdc1394-utils -y
  16. apt-get install swig -y
  17. apt-get install libv4l-0 libv4l-dev -y
  18. apt-get install python-numpy -y
  19. apt-get install libgtk2.0-deb -y
  20. apt-get install libavformat-dev libswscale-dev -y

  21. ######you can not install follow pakage if you donot need follow.
  22. apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk <font color="Red">libtbb-dev</font> libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev -y
  23. apt-get install libpython2.6 python-dev python2.6-dev -y # Only if you want to use python
复制代码
(说明:有些软件找不到,如可选项中的libtbb-dev,确实有那么几个软件没装,不过不影响使用,无所谓了。细心的人会发现,前面一部分是官方要求下的,后面一部分,网上乱搜乱装的。因为安装opencv之前没装libgtk2.0-deb,所以大装特装,再重装 ,果断不再失败)
sudo chmod +x install.sh
sudo ./install.sh

2. make && sudo make install:
  1. $ cmake CMakeLists.txt
  2. $ make && sudo make install
  3. $ sudo leafpad /etc/ld.so.conf
  4. /usr/local/lib #add in the last line.
  5. $ ldconfig
复制代码
(说明:在相应的目录下执行相应的命令,解压opencv.XX后,cd 到opencv.XX, 然后执行上面的一系列命令,注意你的磁盘格式,要支持链接哦,不然只有格式化成其它形式,我用的是ext4格式, 检测可使用命令: ln -s filenamea filenameb;
修改/etc/ld.so.conf是将opencv的库加入系统路径中,不然会报找不到XXX.so的错误,opencv默认安装到/usr/local/lib,这可以从sudo make install 的输出看出来,记得保存输出,出了错方便谷歌\百度\论坛)

3. gcc -ggdb `pkg-config --cflags opencv` -o opencv0 opencv0.c `pkg-config --libs opencv`
(说明:以上是C语言的编译命令,也可以用C++,opencv源码包中也自带一些例子,这个编译命令就是从里面找出来的,网上的编译命令大多不能用。上面的点是`,在数字键12345那一排,Tab的上面,Esc的下面。使用时也可以直接复制
opencv0.c 是一个看图片的程序,将图片怎么怎么处理。运行: ./opencv0.c opencv1.bmp
video0.c 是一个使用摄像头的程序,lubuntu1.05 自带驱动,官方支持的USB摄像头应该都能用,我用的环宇飞扬V6。
运行 ./video0  )

opencv0.c
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "math.h"
  4. #include "cv.h"
  5. #include "highgui.h"
  6. int main(int argc, char *argv[])
  7. {
  8.     IplImage* img = 0; //IPL(Intel Image Processing Library)图像头
  9.     int height, width, step, channels;
  10.     uchar* data;
  11.     int i, j, k;
  12.     if (argc < 2)
  13.     {
  14.         printf("Usage: main<image-file-name>\n\7");
  15.         exit(0);
  16.     }
  17. // 加载图片
  18.     img = cvLoadImage(argv[1],0);
  19.     if (!img)
  20.     {
  21.         printf("Could not load image file: %s\n", argv[1]);
  22.         exit(0);
  23.     }
  24. // 获得图像数据
  25.     height = img->height;
  26.     width = img->width;
  27.     step = img->widthStep;
  28.     channels = img->nChannels;
  29.     data = (uchar*)img->imageData;
  30.     printf("Processing a %d x %d image with %d channels\n", height, width, channels);
  31. // 创建窗体
  32.     cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
  33.     cvMoveWindow("mainWin", 100, 100);
  34. // 翻转图像
  35.     for(i = 0; i < height; i++)
  36.     {
  37.         for(j = 0; j < width; j++)
  38.         {
  39.             for(k = 0; k < channels; k++)
  40.             {
  41.                 data[i * step + j * channels] = 255 - data[i * step + j * channels + k];
  42.             }
  43.         }
  44.     }
  45. // 显示图像
  46.     cvShowImage("mainWin", img);
  47. // 等待一个任意键
  48.     cvWaitKey(0);
  49. // 释放图像
  50.     cvReleaseImage(&img);
  51.     return 0;
  52. }
复制代码
video0.c
  1. //#include "stdafx.h"
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include "stdio.h"


  5. // 实现将拍下来的图片缩放一倍
  6. IplImage* DoPyrDown(IplImage* image)
  7. {
  8.     // 设置大小缩小一倍
  9.     CvSize size = cvSize(image->width / 2,image->height / 2);
  10.     //初始化图片
  11.     IplImage* outImage = cvCreateImage(size,image->depth,image->nChannels);
  12.     //实现缩放
  13.     cvPyrDown(image,outImage,CV_GAUSSIAN_5x5);
  14.     cvReleaseImage(&image);
  15.     return outImage;
  16. };


  17. int main(int argc, char** argv)
  18. {
  19.     cvNamedWindow("vedio",0);
  20.     CvCapture* capture;
  21.     // 首先是要通过摄像设备来得到一个CvCapture对象
  22.     if(1 == argc)
  23.     {
  24.         capture = cvCreateCameraCapture(0);
  25.     }
  26.     else
  27.     {
  28.         capture = cvCreateCameraCapture(atoi(argv[1]));
  29.     }

  30.     assert(NULL != capture);

  31.     IplImage* frame;

  32.     char keyCode;
  33.     // 每隔30ms捕捉一次视频图像
  34.     // 可以设为while(1)  使得实时捕捉视频画面
  35.     while((keyCode = cvWaitKey(30)))
  36.     {
  37.         //表示按下了ESC键,退出
  38.         if(keyCode == 27)
  39.         {
  40.             break;
  41.         }

  42.         //表示按下了回车键,此时应当保存照片
  43.         if(keyCode == 13)
  44.         {
  45.             //初始化一张图片
  46.             IplImage* outImage = cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);
  47.             // 将原图拷贝过来
  48.             cvCopy(frame,outImage,NULL);
  49.             //实现缩放操作
  50.             outImage = DoPyrDown(outImage);
  51.             //设置保存的图片名称和格式
  52.             char* outImageName = "test.jpg";
  53.             //保存图片
  54.             cvSaveImage(outImageName,outImage,0);
  55.             cvReleaseImage(&outImage);
  56.             printf(" 恭喜你,保存图片成功!\n");
  57.         }

  58.         // 得到摄像设备的下一帧图像
  59.         frame = cvQueryFrame(capture);
  60.         if(!frame)
  61.         {
  62.             break;
  63.         }
  64.         cvShowImage("vedio",frame);
  65.     }

  66.     cvReleaseImage(&frame);
  67.     cvDestroyAllWindows();
  68.     return 0;
  69. }

复制代码

评分

参与人数 2威望 +14 金钱 +14 贡献 +19 收起 理由
醉月 + 9 + 9 + 9 赞一个! 先收藏了
matson + 5 + 5 + 10

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-9-1 21:17:41 | 显示全部楼层
4 一些错误及解决办法:
错误a. CMake Error: cmake_symlink_library: System Error: Operation not permitted
原因: 变成超级用户依然报错,磁盘格式不对。
错误b: opencv0: error while loading shared libraries: libopencv_core.so.2.4: cannot open shared object file: No such file or directory
原因:没有添加opencv的库/usr/local/lib到/etc/ld.so.conf, 或者没有 sudo ldconfig
错误c: Processing a 650 x 935 image with 1 channels
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /media/linaro/ssd/opencv-2.4.6.1/modules/highgui/src/window.cpp, line 483
terminate called after throwing an instance of 'cv::Exception'
  what():  /media/linaro/ssd/opencv-2.4.6.1/modules/highgui/src/window.cpp:483: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow

Aborted
原因: 你在装opencv之前没有安装libgtk2.0-dev 。。。,这下只有重装opencv, 使用命令make uninstall ,再 cmake CMakeList.txt ...一路重来吧!

5 效果及bmp图片下载:
(说明: 论坛里不支持bmp图片上传bmp图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2013-9-5 14:34:56 | 显示全部楼层
什么系统哇,给个链接哇
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-5 16:06:12 | 显示全部楼层
qiaoge 发表于 2013-9-5 14:34
什么系统哇,给个链接哇

不是给了链接么?lubuntu-desktop-12.10_v1.05
回复 支持 反对

使用道具 举报

发表于 2013-9-5 21:53:38 | 显示全部楼层
本帖最后由 qiaoge 于 2013-9-6 14:36 编辑
yzbx 发表于 2013-9-5 16:06
不是给了链接么?lubuntu-desktop-12.10_v1.05

你的连接我怎么打开说不行啊,我已经下载了,下载完不是img文件,要怎么刷啊,刷卡还是nand啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-6 19:42:04 | 显示全部楼层
本帖最后由 yzbx 于 2013-9-6 19:52 编辑
qiaoge 发表于 2013-9-5 21:53
你的连接我怎么打开说不行啊,我已经下载了,下载完不是img文件,要怎么刷啊,刷卡还是nand啊 ...

这么奇怪?先解压,应该是img文件,这就是官网的那个网址!我自己用火狐和chromium试过,都能打开的。可能因为服务器或者浏览器,所以才打不开吧。
下载后可以刷到nand中,我就是在linux下用livesuit安装到nand中的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2013-9-7 09:47:04 | 显示全部楼层
好帖,顶一个。
回复 支持 反对

使用道具 举报

发表于 2013-9-8 11:09:12 | 显示全部楼层
yzbx 发表于 2013-9-6 19:42
这么奇怪?先解压,应该是img文件,这就是官网的那个网址!我自己用火狐和chromium试过,都能打开的。可能 ...

刷好了。用迅雷下,然后改成gz,解压
回复 支持 反对

使用道具 举报

发表于 2013-10-20 21:27:32 | 显示全部楼层
请问楼主用的什么摄像头?多少fps?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-23 21:22:19 | 显示全部楼层
znfc2 发表于 2013-10-20 21:27
请问楼主用的什么摄像头?多少fps?

环宇飞扬v6,很拙的一个,建议用罗技,很清析.具体参数我不大关心,现在也没法查,总之对环宇v6的渣渣照片质量很不满意,要舍得花钱买个好点的摄像头.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-23 00:44 , Processed in 0.026600 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部