如何在树莓派上用OpenCV来操纵摄像头拍照
1,安装OpenCV / Install OpenCV
命令:
命令:
上面的命令连OpenCV的示例一起装上了,这样我们在安装好之后就可以编译几个示例来测试。
此命令也将安装OpenCV的样本。因此,我们可以编译运行及多个样品有installa经过测试 TI 上。
2,带动摄像头/驱动摄像头
在驱动已经可用的情况下,把一个USB摄像头接在USB口上也不一定能让它工作,因为Pi的USB口的电流供应可能不足。请看这个链接的玩家自制的一根增强供电的USB线,如果你想简单安全,那么你可以把摄像头接在一个有外部供电的USB HUB上,再把Pi的USB接到USB HUB上,这样摄像头的供电就充足了。
将USB网络摄像头插入到Pi的USB接口可能无法使其工作,即使驱动程序已经可用,因为Pi的USB接口提供的当前可能不足以驱动相机。您可以通过此链接学习DIY当前增强型USB电缆,但更简单的方法可能是购买有源USB HUB,并使用它连接网络摄像头和Pi。
3,让opencv的示例跑起来/运行OpenCV的样本
为了验证在Pi上安装的OpenCV是可用的,所以至少要让一个示例可以跑起来。
为了不把安装目录弄得一团乱,首先把安装好的OpenCV的示例目录拷贝到其他地方:
为了确保安装的OpenCV相关软件包是“正确的”,我决定运行至少一个OpenCV示例。
将安装的OpenCV示例目录复制到其他位置是为了不弄乱安装目录:
我们看到里面有“c”,“cpp”和“gpu”三种样本,选最简单的,我们进入“c”,先为所有文件加上写权限:
有3种样本, c“,”cpp“&”gpu“,所以选择最简单的”c“,并输入”c“目录,向所有文件添加写入权限:
然后我们看到“c”目录里有编译脚本build_all.sh,执行它,看到出了一堆相似的错误,没有一个程序可以成功编译,例如以下错误:
执行build_all.sh脚本来编译一个示例,然后我有很多类似的错误,例如:
[root @ alarmpi c]#. / build_all.sh contours.c
编译轮廓
/ usr / bin / ld:/tmp/cch4zRSn.o:未定义的引用符号'lrint @@ GLIBC_2.4'
/ usr / bin / ld:note:'lrint @@ GLIBC_2.4'在DSO /usr/lib/libm.so.6中定义,所以尝试将其添加到链接器命令行
/ usr / lib / libm .so.6:无法读取符号:无效操作
collect2:错误:ld返回1退出状态
由libm可见,这是因为数学库没有被包含在编译命令中,于是我们编译build_all.sh,为所有编译命令添加上-lm编译参数:
“libm”告诉我,数学库没有包含在编译命令中,所以我编辑了build_all.sh并将-lm添加到所有的编译命令:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#!/ bin / sh
if [$#-gt 0]; 然后
base =`basename $ 1 .c`
echo“编译$ base”
gcc -ggdb`pkg-config opencv --cflags --libs` $ base.c -o $ base -lm
else
for i in * .c; 做
回声“编译$ i”
gcc -ggdb`pkg-config --cflags opencv` -o`basename $ i .c` $ i`pkg-config --libs opencv` -lm; 为我在* .cpp中
完成
做
回声“编译$ i”
g ++ -ggdb`pkg-config --cflags opencv` -o`basename $ i .cpp` $ i`pkg-config --libs opencv` -lm;
完成
fi
文章来源: http : //www.codelast.com/
还忘了说一句,由于上面的脚本在编译时使用了pkg-config,所以在编译前,我们还需要先安装pkg-config:
对不起,我忘了提到,因为使用pkg-config,我们需要在编译示例之前安装pkg-config:
1
pacman -S pkg-config
然后再编译,成功,然后编译
将成功。
那么下面,我们再接着尝试把编译出的示例运行起来:
然后运行我们刚刚编译的可执行程序:
01
02
03
04
05
06
07
08
09
10
11
很明显,运行不起来。
看样子是跟gtk相关,并且我在网上搜到这跟X服务器什么的可能有关系,于是安装gtk和X服务器:
它失败了,不幸的是。
而Google告诉我,这个错误与X服务器有关,所以我安装了gtk&X服务器:
1
pacman -Sgtk xorg-server
再修改配置文件/ etc / ssh / sshd_config:
修改配置文件/ etc / ssh / sshd_config:
注意,没有注释的那三行是我添加的。
请注意,我添加了3条未注释的行。
文章来源: http : //www.codelast.com/
重启Pi的系统,运行X server:
Reboot Pi&run X服务器:
没错,命令就是这么简单。然后又出错了:
是的,命令只是这么简单,但是没有启动:
既然它让我看日志文件/var/log/Xorg.0.log,那我就看。在日志文件的最后,发现提示找不到fbdev模块/库,于是翻遍谷歌,找到一个答案:应该安装xf86-video-fbdev包:
因为它告诉我检查日志文件/var/log/Xorg.0.log,那我就做了。在日志文件的最后几行,我发现一个错误消息,指出fbdev模块/ lib丢失,所以我再问一次Google,我意识到我应该安装包xf86-video-fbdev:
再用“X”命令启动X服务器,成功了:
再试着运行OpenCV的示例,依然不行,Google搜索到一篇在Pi上运行OpenCV的文章,作者做了这样一件事情:
然后我试图再次运行OpenCV样本,仍然是同样的错误(“不能打开显示“),所以我Googled关于在Pi上使用OpenCV的另一篇文章,发现作者做了一件事:
其中,192.168.3.65是Pi的IP地址。这样设置之后,再运行,程序不再报错了!再一看相同的目录下,生成了一个contours.xml文件,说明程序执行成功了
,其中“ 192.168.3.65“是您的Pi的IP地址。设置完毕后,样本可以运行而没有发生任何错误,并且在同一目录下生成了一个contours.xml文件,这表明我们成功了。
【4】写一个简单的OpenCV C程序/写一个简单的OpenCV C程序
现在该写一个简单的OpenCV C程序来控制摄像头了
现在我们应该使用OpenCV编写一个简单的C程序来控制网络摄像头
直接看程序:
让我们来看看C代码:
此程序做的事情非常简单:初始化摄像头,抓取一帧,然后保存为名为“webcam.jpg”的图片。
该程序做一个非常简单的工作:初始化相机,捕获帧并将其保存到图像文件名为“webcam.jpg”。
编译自己的webcam程序:
然后编译网络摄像头程序:
会生成一个可执行程序“webcam”,运行它:
这将生成一个可执行文件“webcam”,只需运行它:
然后在相同目录下,会看到生成了一个“webcam.jpg”图片,正是摄像头拍的照,
然后我们将在同一目录下找到一个“webcam.jpg”图像文件,这只是照片相机。
这样,本文的主要目的就达成了。可以在此基础上继续开发其他的程序,来实现更为有用的功能,例如像摄像头娘一样的运动检测功能,
因此,本文的主要目的已经到达 我们可以开发更有用的程序,例如类似于Camera Girl的程序,它实现运动检测功能。
【5】遗留问题/未解决的问题
在上述过程中,其实我还遇到了一些未解决的问题,暂时没有时间深究,在此先记录如下。在上述过程中,遇到一些未解决的问题,没有时间
探索他们还在,所以我只是把它们写下来进一步学习。
使用稍高的分辨率就导致程序崩溃/使用一点高分辨率会导致程序崩溃
在上面的程序中,如下两句是用于设置分辨率的(宽*高):
在上面的代码下面的两行用于设置分辨率:
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_HEIGHT,240);
根据我的试验,160 * 120的低分辨率比较少出问题,尽管320 * 240的分辨率对摄像头来说也根本不算高的,但是就算是使用320 * 240的分辨率,程序还是偶尔会崩溃的,报错如下:
根据我的实验,160 * 120的低分辨率比较高的分辨率导致更少的崩溃。即使320 * 240对于网络摄像头来说也不是一个高分辨率,它仍然使程序崩溃了一些,错误信息是:
或者:
或者:
我不知道这个问题是由于Pi的CPU的计算能力弱,Pi还是太小的RAM,还是网络摄像机的电流供应不足(我没有使用电源的USB HUB来连接摄像头到Pi)或网络摄像头的Linux驱动程序...
如果你知道某事,请告诉我,并提前感谢你
我不确定这是跟Pi的CPU计算能力较弱有关呢,还是跟Pi的RAM太小有关还是跟摄摄像头的供电不足有关呢(我没有使用带 电源 的USB HUB来接摄像头),或者是跟摄摄像头的驱动有关呢?
如果你知道解决办法,请赐教,非常感谢。
1,安装OpenCV / Install OpenCV
命令:
命令:
上面的命令连OpenCV的示例一起装上了,这样我们在安装好之后就可以编译几个示例来测试。
此命令也将安装OpenCV的样本。因此,我们可以编译运行及多个样品有installa经过测试 TI 上。
2,带动摄像头/驱动摄像头
在驱动已经可用的情况下,把一个USB摄像头接在USB口上也不一定能让它工作,因为Pi的USB口的电流供应可能不足。请看这个链接的玩家自制的一根增强供电的USB线,如果你想简单安全,那么你可以把摄像头接在一个有外部供电的USB HUB上,再把Pi的USB接到USB HUB上,这样摄像头的供电就充足了。
将USB网络摄像头插入到Pi的USB接口可能无法使其工作,即使驱动程序已经可用,因为Pi的USB接口提供的当前可能不足以驱动相机。您可以通过此链接学习DIY当前增强型USB电缆,但更简单的方法可能是购买有源USB HUB,并使用它连接网络摄像头和Pi。
3,让opencv的示例跑起来/运行OpenCV的样本
为了验证在Pi上安装的OpenCV是可用的,所以至少要让一个示例可以跑起来。
为了不把安装目录弄得一团乱,首先把安装好的OpenCV的示例目录拷贝到其他地方:
为了确保安装的OpenCV相关软件包是“正确的”,我决定运行至少一个OpenCV示例。
将安装的OpenCV示例目录复制到其他位置是为了不弄乱安装目录:
我们看到里面有“c”,“cpp”和“gpu”三种样本,选最简单的,我们进入“c”,先为所有文件加上写权限:
有3种样本, c“,”cpp“&”gpu“,所以选择最简单的”c“,并输入”c“目录,向所有文件添加写入权限:
然后我们看到“c”目录里有编译脚本build_all.sh,执行它,看到出了一堆相似的错误,没有一个程序可以成功编译,例如以下错误:
执行build_all.sh脚本来编译一个示例,然后我有很多类似的错误,例如:
[root @ alarmpi c]#. / build_all.sh contours.c
编译轮廓
/ usr / bin / ld:/tmp/cch4zRSn.o:未定义的引用符号'lrint @@ GLIBC_2.4'
/ usr / bin / ld:note:'lrint @@ GLIBC_2.4'在DSO /usr/lib/libm.so.6中定义,所以尝试将其添加到链接器命令行
/ usr / lib / libm .so.6:无法读取符号:无效操作
collect2:错误:ld返回1退出状态
由libm可见,这是因为数学库没有被包含在编译命令中,于是我们编译build_all.sh,为所有编译命令添加上-lm编译参数:
“libm”告诉我,数学库没有包含在编译命令中,所以我编辑了build_all.sh并将-lm添加到所有的编译命令:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#!/ bin / sh
if [$#-gt 0]; 然后
base =`basename $ 1 .c`
echo“编译$ base”
gcc -ggdb`pkg-config opencv --cflags --libs` $ base.c -o $ base -lm
else
for i in * .c; 做
回声“编译$ i”
gcc -ggdb`pkg-config --cflags opencv` -o`basename $ i .c` $ i`pkg-config --libs opencv` -lm; 为我在* .cpp中
完成
做
回声“编译$ i”
g ++ -ggdb`pkg-config --cflags opencv` -o`basename $ i .cpp` $ i`pkg-config --libs opencv` -lm;
完成
fi
文章来源: http : //www.codelast.com/
还忘了说一句,由于上面的脚本在编译时使用了pkg-config,所以在编译前,我们还需要先安装pkg-config:
对不起,我忘了提到,因为使用pkg-config,我们需要在编译示例之前安装pkg-config:
1
pacman -S pkg-config
然后再编译,成功,然后编译
将成功。
那么下面,我们再接着尝试把编译出的示例运行起来:
然后运行我们刚刚编译的可执行程序:
01
02
03
04
05
06
07
08
09
10
11
很明显,运行不起来。
看样子是跟gtk相关,并且我在网上搜到这跟X服务器什么的可能有关系,于是安装gtk和X服务器:
它失败了,不幸的是。
而Google告诉我,这个错误与X服务器有关,所以我安装了gtk&X服务器:
1
pacman -Sgtk xorg-server
再修改配置文件/ etc / ssh / sshd_config:
修改配置文件/ etc / ssh / sshd_config:
注意,没有注释的那三行是我添加的。
请注意,我添加了3条未注释的行。
文章来源: http : //www.codelast.com/
重启Pi的系统,运行X server:
Reboot Pi&run X服务器:
没错,命令就是这么简单。然后又出错了:
是的,命令只是这么简单,但是没有启动:
既然它让我看日志文件/var/log/Xorg.0.log,那我就看。在日志文件的最后,发现提示找不到fbdev模块/库,于是翻遍谷歌,找到一个答案:应该安装xf86-video-fbdev包:
因为它告诉我检查日志文件/var/log/Xorg.0.log,那我就做了。在日志文件的最后几行,我发现一个错误消息,指出fbdev模块/ lib丢失,所以我再问一次Google,我意识到我应该安装包xf86-video-fbdev:
再用“X”命令启动X服务器,成功了:
再试着运行OpenCV的示例,依然不行,Google搜索到一篇在Pi上运行OpenCV的文章,作者做了这样一件事情:
然后我试图再次运行OpenCV样本,仍然是同样的错误(“不能打开显示“),所以我Googled关于在Pi上使用OpenCV的另一篇文章,发现作者做了一件事:
其中,192.168.3.65是Pi的IP地址。这样设置之后,再运行,程序不再报错了!再一看相同的目录下,生成了一个contours.xml文件,说明程序执行成功了
,其中“ 192.168.3.65“是您的Pi的IP地址。设置完毕后,样本可以运行而没有发生任何错误,并且在同一目录下生成了一个contours.xml文件,这表明我们成功了。
【4】写一个简单的OpenCV C程序/写一个简单的OpenCV C程序
现在该写一个简单的OpenCV C程序来控制摄像头了
现在我们应该使用OpenCV编写一个简单的C程序来控制网络摄像头
直接看程序:
让我们来看看C代码:
此程序做的事情非常简单:初始化摄像头,抓取一帧,然后保存为名为“webcam.jpg”的图片。
该程序做一个非常简单的工作:初始化相机,捕获帧并将其保存到图像文件名为“webcam.jpg”。
编译自己的webcam程序:
然后编译网络摄像头程序:
会生成一个可执行程序“webcam”,运行它:
这将生成一个可执行文件“webcam”,只需运行它:
然后在相同目录下,会看到生成了一个“webcam.jpg”图片,正是摄像头拍的照,
然后我们将在同一目录下找到一个“webcam.jpg”图像文件,这只是照片相机。
这样,本文的主要目的就达成了。可以在此基础上继续开发其他的程序,来实现更为有用的功能,例如像摄像头娘一样的运动检测功能,
因此,本文的主要目的已经到达 我们可以开发更有用的程序,例如类似于Camera Girl的程序,它实现运动检测功能。
【5】遗留问题/未解决的问题
在上述过程中,其实我还遇到了一些未解决的问题,暂时没有时间深究,在此先记录如下。在上述过程中,遇到一些未解决的问题,没有时间
探索他们还在,所以我只是把它们写下来进一步学习。
使用稍高的分辨率就导致程序崩溃/使用一点高分辨率会导致程序崩溃
在上面的程序中,如下两句是用于设置分辨率的(宽*高):
在上面的代码下面的两行用于设置分辨率:
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_HEIGHT,240);
根据我的试验,160 * 120的低分辨率比较少出问题,尽管320 * 240的分辨率对摄像头来说也根本不算高的,但是就算是使用320 * 240的分辨率,程序还是偶尔会崩溃的,报错如下:
根据我的实验,160 * 120的低分辨率比较高的分辨率导致更少的崩溃。即使320 * 240对于网络摄像头来说也不是一个高分辨率,它仍然使程序崩溃了一些,错误信息是:
或者:
或者:
我不知道这个问题是由于Pi的CPU的计算能力弱,Pi还是太小的RAM,还是网络摄像机的电流供应不足(我没有使用电源的USB HUB来连接摄像头到Pi)或网络摄像头的Linux驱动程序...
如果你知道某事,请告诉我,并提前感谢你
我不确定这是跟Pi的CPU计算能力较弱有关呢,还是跟Pi的RAM太小有关还是跟摄摄像头的供电不足有关呢(我没有使用带 电源 的USB HUB来接摄像头),或者是跟摄摄像头的驱动有关呢?
如果你知道解决办法,请赐教,非常感谢。