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

编程知识 更新时间:2023-04-17 02:16:59

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

直接上代码:(代码参考自:
http://blog.leanote/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 type
cv::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"); 

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

更多推荐

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

本文发布于:2023-04-13 16:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/4c6604002bd74441b494e13192548225.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:摄像头   手机   windows   opencv

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 73210文章数
  • 14阅读数
  • 0评论数