在windows下调用手机摄像头,并传给opencv

来源:互联网 发布:网店数据分析报告 编辑:程序博客网 时间:2024/06/10 11:35

(还有一种超级简单的方法
http://blog.csdn.net/qq_31669419/article/details/53312128
写完这篇才发现,������)

直接上代码:(代码参考自:
http://blog.leanote.com/post/5387106a702afd5911000000)
整篇教程是针对windows的,linux类似,我相信会用linux的,对照本篇教程也能完成配置。

#include <stdio.h>#include "curl/curl.h"#include <sstream> #include <iostream>#include <vector> #include <opencv2/opencv.hpp>using namespace std;using namespace cv;size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) {    ostringstream *stream = (ostringstream*)userdata;    size_t count = size * nmemb;    stream->write(ptr, count);    return count;}//function to retrieve the image as Cv::Mat data typecv::Mat curlImg(){    CURL *curl;    CURLcode res;    ostringstream stream;    curl = curl_easy_init();    curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.100:8080/shot.jpg"); //the JPEG Frame url    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); // pass the writefunction    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream); // pass the stream ptr when the writefunction is called    res = curl_easy_perform(curl); // start curl    string output = stream.str(); // convert the stream into a string    curl_easy_cleanup(curl); //cleanup    vector<char> data = vector<char>(output.begin(), output.end()); //convert string into a vector    Mat data_mat = Mat(data); // create the cv::Mat datatype from the vector    Mat image = imdecode(data_mat, 1); //read an image from memory buffer    return image;}int main(void){    double scale = 1;    while (1)    {        Mat image = curlImg(); // get the image frame        //可以不resize,不过电脑端会图像显示很大        Size dsize = cv::Size(image.cols*scale, image.rows*scale);        Mat image2 = cv::Mat(dsize, CV_32S);        resize(image, image2, dsize);        imshow("Image output", image2);         char c = cvWaitKey(1);         if (c == 27) break;           }    cv::destroyWindow("Image output");}

如果之前能顺利使用opencv的话,这里仅存在找不到头文件curl/curl.h这一个错误。
先下载curl的源码:http://curl.mirror.anstey.ca/curl-7.51.0.zip

1.将include目录下的curl文件夹复制到VS的工程目录下(与你的cpp同目录)

2.编译curl

我相信使用opencv的人不会没有cmake(没有还不快去下,最新版就行,linux下更不用说),打开cmake的gui

2.1在下载的curl目录下新建一个build目录,如下图,填入curl的源码路径和编译路径:

这里写图片描述
我的curl源码是放在c盘根目录下的,根据自己放的实际路径填写即可

2.2 点击Configure,弹出的对话框选默认的编译器就行,完成后弹出error,没关系,先取消勾选BUILD中的BUILD_TESTING选项

这里写图片描述

2.2 再次Configure,这时红色应该消失了,如上图所示,点击Generate

这里写图片描述
下面输出中有几行红色无所谓,不是error就行

2.3 打开bulid文件夹下的CURL.sln,根据你的程序,注意选择Release或者Debug(默认为Debug,但我习惯于Release,这里已Release为例),右键ALL_BUILD——生成

按道理应该再右键INSTALL——生成,但我这里会出错,没解决,这不关键
这里写图片描述

3.在2.1步新建的bulid文件夹下,找到lib文件夹

这里写图片描述
根据你选择的release或者debug,这里会生成相应的库文件

3.1将release或者debug里面的文件全部复制到自己VS的工程目录下,比如我的事这样的:

这里写图片描述

3.2添加lib库文件,如果你配置过opencv,这应该相当熟悉

在工程的“属性——配置属性——链接器——输入——附加依赖项”中添加libcurl_imp.lib:
这里写图片描述
编译运行看是否通过。

4.手机端的准备

此时运行上述程序还是会因为获取不到图像而出错的。
以安卓手机为例(苹果应该类似,没有手机无法实验),下载安装软件——IP摄像头,应该是不难找的,找不到我再传吧。
打开软件,开启服务器:
这里写图片描述
这里会有一个地址:192.168.1.100:8080,把它输入到浏览器中应该是能访问的,这一步没问题的话,上述代码中有一行:

curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.100:8080/shot.jpg"); 

将其中的地址替换为你自己的地址,然后就可以编译运行啦!试试吧

0 0