我想使用USB网络摄像头(在一个小型C++/OpenCV应用程序中),并从PHP脚本中调用它。我的测试应用程序如下:
int main( int argc, char **argv )
{
cv::VideoCapture C( 0 );
cout << "C.isOpened() = " << boolalpha << C.isOpened() << endl;
return 0;
}
PHP脚本如下:
<?php
exec( escapeshellcmd( '/thepath/theapp' ), $output, $result );
var_dump( $output );
?>
当我直接从命令行调用此应用程序时,它会返回true。
当我像php -f /the_php_script.php
这样通过php调用应用程序时,它会返回true。
当我通过AJAX从html文件(带按钮)调用的php调用应用程序时,它会通过Apache,然后返回false。
所以,我的应用程序运行良好。我的php脚本也很好用。但有一个权限或类似的东西阻止php通过Apache访问网络摄像头(用OpenCV库初始化它),,但该权限足以允许应用程序运行。
有人能帮我吗?知道吗?
谢谢!
编辑1:
根据一个建议,我尝试在不使用AJAX的情况下使用php脚本来启动我的应用程序。我获得了相同的结果,即OpenCV无法初始化服务器上的USB网络摄像头。
对于那些可能对这个问题感兴趣的人。。。
我面临的问题有两个方面:通过从客户端调用的php脚本初始化USB网络摄像头,并从该php脚本启动一个应用程序,该应用程序可以将图像写入文件夹/var/www/images
中的磁盘。
- 为了启用USB摄像头,我只需要将用户www data(Apache)添加到视频组中。我通过查看自己的帐户找到了它:我看到我是这个小组的成员,所以添加Apache似乎也是很自然的
- 为了允许应用程序(从相机捕获图像)将它们存储在文件夹
/var/www/images
中,我观察到子文件夹images
属于用户root,并且是root组的成员。由于是Apache运行php脚本来调用我的应用程序,所以我将images
的所有者切换为www-data
正如我们在法语中所说Voilà!
感谢所有给我一些提示的人!