2014-01-30 54 views
4

所以,我想编写一个程序,使来自OpenCV的处理输出的被看作是一个摄像头。我想用它来创建像Skype这样的程序的效果。我被卡住了谷歌搜索导致没有帮助。请帮帮我。我需要为此获得驱动程序吗?将AVI存储为AVI并将其与其他应用程序进行流式传输一样呢?使用OpenCV的输出作为网络摄像头

我想编写一个程序来掩盖我的脸,所以我不用担心我的隐私的人,我当家教的Skype-ING和个人不知道!

顺便说一句,我使用C还挺新++。但是,这是我喜欢的语言。但是,我也了解Java和Python。

你会建议我尝试让图书馆的其他库/收藏,喜欢了openFrameworks?

我正在用C++编程OpenCV。这里是为我所有的可用平台: Ubuntu的: 来自OpenCV的apt-get的,与pkg配置,Qt Creator的 Ubuntu的: 来自OpenCV的apt-get的,与pkg配置和libfreenect,Qt Creator的 Windows 7中: OpenCV 2.4.8.0,最新二进制文件,x86,Visual Studio 2010 express Windows 7: OpenCV未安装 Windows 8.1 Pro: OpenCV 2.4.8.0,最新的二进制文件,x86,Visual Studio Express 2013 Express桌面,Hyper-V,相同配置的Windows 7:1

我注意到了一些混乱。我正在尝试使用打开的CV输出的流程,并将它发送到Skype等其他程序。主要意图是我要教小学的孩子们编程和OpenCV。我想直接输出流,所以我不必共享我的桌面。

+0

你看过SplitCam方法吗? – scap3y

+0

它适用于Linux吗?我想使用OpenSource,所以我可以针对不同的环境编译它! – yash101

回答

0

一种方法是做这个是送垫目标直接插口,并在接收侧转换字节数组太,但问题是,你需要两个都在PC上安装OpenCV。用另一种方法,您可以使用Mjpeg流媒体将视频流式传输到ibternet并在接收端处理视频,这里您只需在接收端安装OpenCV。

采用Socket

获取Mat.data并直接发送到插座,数据格式是这样BGR BGR BGR ....在接收端,你应该知道像你要的大小接收。在接收到刚刚分配接收到的缓冲区(BGR BGR ...数组)到您已知的大小的矩阵。

客户: -

Mat frame; 
frame = (frame.reshape(0,1)); // to make it continuous 

int imgSize = frame.total()*frame.elemSize(); 

// Send data here 
bytes = send(clientSock, frame.data, imgSize, 0)) 

服务器: -

Mat img = Mat::zeros(height,width, CV_8UC3); 
    int imgSize = img.total()*img.elemSize(); 
    uchar sockData[imgSize]; 

//Receive data here 

    for (int i = 0; i < imgSize; i += bytes) { 
    if ((bytes = recv(connectSock, sockData +i, imgSize - i, 0)) == -1) { 
    quit("recv failed", 1); 
    } 
    } 

// Assign pixel value to img 

int ptr=0; 
for (int i = 0; i < img.rows; i++) { 
    for (int j = 0; j < img.cols; j++) {          
    img.at<cv::Vec3b>(i,j) = cv::Vec3b(sockData[ptr+ 0],sockData[ptr+1],sockData[ptr+2]); 
    ptr=ptr+3; 
    } 
    } 

对于套接字编程,你可以参考这个link

采用MJPEG流光

在这里,您需要安装Mjpeg streamer software在安装了网络摄像头的PC上以及所有接收PC上,您需要安装OpenCV并从中进行处理。您也可以使用OpenCV的VideoCapture直接打开网页流类像

Cap.open("http://192.168.1.30:8080/?dummy=param.mjpg"); 
+0

我当时也在思考这些问题,但是如何使用服务器作为网络摄像机模拟器,以便任何应用程序都能检测到它的提要。 – scap3y

+0

然后,您可以尝试编辑Mjpeg流光源,您可以直接将jpg文件流式传输到网页,并且您可以通过网络浏览器或vlc等软件访问此流。所以你可以编辑Mjpeg流媒体使用的v4l驱动程序并首先处理帧,然后进行流处理。并尝试一下[OpenCV移植到Google Chrome NaCl和PNaCl](http://opencv.org/opencv-ported-to-google-chrome-nacl-and-pnacl.html) – Haris

+0

好吧,我试过这样做但我无法将我的相机输入替换为我程序输出的输入。:/ – scap3y

3

所以,我发现这个黑客攻击;不一定是最好的方法,但它肯定有效..

下载类似SplitCam的程序;这可以模拟从视频文件中,IP饲料和/或桌面屏幕的特定部分摄像头饲料..

所以在本质上,你可以写一个程序来处理网络摄像头视频,并使用OpenCV中的显示它highgui窗口,您可以使用SplitCam将此窗口作为任何其他应用程序(如Skype)的输入。我现在试过了,它完美的工作。

HTH

+1

绝对*最省力*解决方案 – berak

+0

@berak - 嗯,我找不到另一种方式来得到这个工作.. :) ..我很想知道一个更“直接”的方法,虽然.. – scap3y

+0

我会知道如何写一个[mjpg流](https://github.com/berak/opencv_smallfry/blob/master/mjpg_serve.py)到一个套接字,但关于你的发现的好处似乎是,它模仿一个'网络摄像头驱动程序',所以任意程序可以使用它 – berak