【智能家居】8、摄像头模块安装以及监控代码编写

 一、摄像头模块安装与配置

一、摄像头选型与连接

摄像头模块RaspBerry Pi Camera Module V2

树莓派断电后将摄像头 模块排针接到下图所示的口中(注意排针方向)

 

二、树莓派配置mjpg-streamer

1、扩容

df -h

首先输入df -h命令查看可用空间,如果空间不足配置过程中可能会遇到 E: You don t have enough free space in /var/cache/apt/archives/.这个报错

 扩容步骤https://mp.csdn.net/mp_blog/creation/editor/136244710

2、配置

步骤一
sudo apt-get update    #更新软件列表

sudo apt-get upgrade  #更新软件
步骤二
sudo apt-get install subversion  #Subversion是一个自由开源的版本控制系统
步骤三
sudo apt-get install libjpeg8-dev  #JPEG支持库

sudo apt-get install imagemagick

sudo apt-get install libv4l-dev   #4l是小写"L"

sudo apt-get install cmake  #下载编译工具
步骤四
sudo apt-get install git
步骤五(在Downloads目录下)
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git

步骤六(在Downloads目录下)
cd mjpg-streamer/mjpg-streamer-experimental #进入下载目录后进入左侧路径

步骤七(在/Downloads/mjpg-streamer/mjpg-streamer-experimentals目录下)
make all#编译
步骤八(在/Downloads/mjpg-streamer/mjpg-streamer-experimentals目录下)
sudo make install #安装

sudo vi start.sh

将下图红框处修改为./input_raspicam.so

sudo raspi-config #开启树莓派摄像头 

 

 

用“Tab”键选择“Finish”后按回车

重启

步骤九(在/Downloads/mjpg-streamer/mjpg-streamer-experimentals目录下)
./start.sh

或者

sudo mjpg_streamer -i "./input_uvc.so -r 640x480 -f 10 -n" -o "./output_http.so -p 8088 -w /usr/local/www"  #此命令尤为重要,如下图所示,输出信息,说明成功!(端口号8080以上就行,但要和后面编写代码一致就行)

报错

ERROR opening V4L interface: No such file or directory
 i: init_VideoIn failed

解决办法

sudo modprobe bcm2835-v4l2

步骤十
http://树莓派IP地址:端口号

在浏览器输入 http://树莓派IP地址:端口号,回车 显示如下页面,点击页面左侧,Stream栏,显示监视画面

如果是下面这种情况

404: Not Found!
Could not open file

将命令换成

http://树莓派IP地址:端口号/?action=stream

 成功,动一动物体测试摄像头实时性

二、代码编写

人脸识别方案使用翔云提供技术支持

翔云_人工智能_API_服务平台z

注册后在首页选择产品--人脸识别 --购买

 选择免费后会出现一个二维码让你扫码加微信,加了微信后他们会发给你一个链接用于输入手机号领取免费测试条数(一个账号可以免费领取100条 有效期5天)有钱的话可以直接买

公司开发大项目的他们会给更多免费条数,但我的演技拙劣被他们识破了,建议多备几个手机号

 一、libcutrl库

1、简介

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。

libcurl的官网 http://curl.haxx.se/

2、libcurl的使用

调用curl_global_init()初始化libcurl

调用curl_easy_init()函数得到 easy interface型指针

调用curl_easy_setopt()设置传输选项

根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
调用curl_easy_perform()函数完成传输任务
调用curl_easy_cleanup()释放内存

 库下载Release 7.71.1 · curl/curl · GitHub

3、libcutrl库学习安装测试

将下载的压缩包放到虚拟机里并解压

解压完成生成一个名为curl.7.71.1的文件夹,进入里面有一系列开源压缩包

 查看doc文件夹下的INSTALL.md学习如何安装库

(1)安装libcutrl

在~/httpHandler/curl-7.71.1目录下

./configure --prefix=$PWD/_install  #配置

make #编译

make install #安装拷贝

 (2)测试打开百度网页
#include <stdio.h>
#include <curl/curl.h>

#define true 1
#define false 0
typedef unsigned int bool;

bool getUrl(char *filename)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;
    if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储
        return false;
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Accept: Agent-007");
    curl = curl_easy_init();    // 初始化
    if (curl)
    {
        //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
        curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
        res = curl_easy_perform(curl);   // 执行
        if (res != 0) {

            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
        }
        fclose(fp);
        return true;
    }
}
bool postUrl(char *filename)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;
    if ((fp = fopen(filename, "w")) == NULL)
        return false;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容
        //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
        curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi ");   // 指定url
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
    fclose(fp);
    return true;
}
int main(void)
{
    getUrl("/tmp/get.html");
    postUrl("/tmp/post.html");
}

编译运行

gcc demo1.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl

环境变量导致错误,gcc编译的时候首先在usr/lib路径里面去找库,但我们的libcutrl库是我们自己加进来的路径是在./curl-7.71.1/_install/lib下

export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/

再次运行后打开get.html文件发现访问成功

4、人脸识别代码编写预热

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>

#define true 1
#define false 0
typedef unsigned int bool;

// 定义一个缓冲区用于存储接收到的数据
static char response_buffer[10240];

// 重写readData回调函数以累积数据
size_t readData(void *ptr, size_t size, size_t nmemb, void *userdata) {
    size_t actual_size = size * nmemb;
    if (actual_size > sizeof(response_buffer) - strlen(response_buffer) - 1) {
        actual_size = sizeof(response_buffer) - strlen(response_buffer) - 1;
    }
    strncat(response_buffer, (const char*)ptr, actual_size);
    response_buffer[sizeof(response_buffer) - 1] = '\0'; // 确保字符串结尾有'\0'
    
    printf("===============get Data===============\n");
    printf("%s\n", response_buffer);
    
    return actual_size; // 返回处理的实际字节数
}

bool postUrl() {
    CURL *curl;
    CURLcode res;
    char *postString;

    char img1[12];
    char img2[12];

    const char *key = "翔云个人中心查看OCR Key";
    const char *secret = "翔云个人中心查看OCR secret";
    int typeId = 21;
    const char *format = "xml";

    postString = (char *)malloc(strlen(key) + strlen(secret) + 2048);
    sprintf(postString, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s", "","", key, secret, typeId, format);

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);    // 指定post内容
        curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");   // 指定url
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_buffer); // 设置写入数据的目标缓冲区
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData); // 设置写入回调函数
        res = curl_easy_perform(curl);
        printf("OK:%d\n", res);
        curl_easy_cleanup(curl);
    }

    free(postString);
    return true;
}

int main(void) {
    postUrl();
    return 0;
}
(1)编译运行
gcc demo2.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib -lcurl

运行报错./a.out: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

原因:未安装curl

sudo apt-get update
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install curl

安装后运行

发现并不是我们想要的效果,因为目前libcurl缺少openssl不支持https的访问

(2)编译openssl支持libcurl的https访问
1)删除_install
2)openssl

下载压缩包

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz

解压

tar xvf openssl-1.1.1a.tar.gz

安装

./config

编译(时间有点长,耐心等待,只要不报错就OK)

make

 安装

sudo make install

在docs/INSTALL.md文件内有介绍

./configure --prefix=$PWD/_install --with-ssl

 编译

make

安装

sudo make install

 (3)再次编译运行

gcc demo8.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib -lcurl

二、实战

一、人脸识别初体验

将普通格式图片转成base64格式

Base64格式图片是一种将原始的二进制图像数据编码为ASCII字符序列的过程。这种编码方法使得原本不适合直接在纯文本环境中传输的图片数据能够以文本的形式在网络上传输。使用Linux自带功能生成二进制编码。

封装一个函数

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>	
#include <sys/types.h>
#include <unistd.h>

#define true 1
#define false 0
typedef unsigned int bool;

// 定义一个缓冲区用于存储接收到的数据
static char response_buffer[10240];

// 重写readData回调函数以累积数据
size_t readData(void *ptr, size_t size, size_t nmemb, void *userdata) {
    size_t actual_size = size * nmemb;
    if (actual_size > sizeof(response_buffer) - strlen(response_buffer) - 1) {
        actual_size = sizeof(response_buffer) - strlen(response_buffer) - 1;
    }
    strncat(response_buffer, (const char*)ptr, actual_size);
    response_buffer[sizeof(response_buffer) - 1] = '\0'; // 确保字符串结尾有'\0'
    
   //printf("===============get Data===============\n");
   //printf("%s\n", response_buffer);
    
    return actual_size; // 返回处理的实际字节数
}

char *getBase64(char *filePath){
	char cmd[128]={'\0'};
	sprintf(cmd,"base64 %s >tmpFile",filePath);
	system(cmd);
	int fd=open("./tmpFile",O_RDWR);
	int fileLen=lseek(fd,0,SEEK_END);
	lseek(fd,0,SEEK_SET);
	char *bufPic=(char *)malloc(fileLen+2);
	memset(bufPic,0,fileLen+2);
	read(fd,bufPic,fileLen);
	close(fd);
	system("rm -f tmpFile");	

	close(fd);
	return bufPic;
}

bool postUrl() {
    CURL *curl;
    CURLcode res;
    char *postString;

    const char *key = "你的key";
    const char *secret = "你的secret";
    int typeId = 21;
    const char *format = "xml";
	
	char *buf1=getBase64("./LBJ1.png");
	char *buf2=getBase64("./LBJ2.png");		
    int len=strlen(key) + strlen(secret) + strlen(buf1)+ strlen(buf2)+1024;
    postString = (char *)malloc(len);
	memset(postString,'\0',len);
    sprintf(postString, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s", buf1, buf2, key, secret, typeId, format);

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);    // 指定post内容
        curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");   // 指定url
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_buffer); // 设置写入数据的目标缓冲区
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData); // 设置写入回调函数
        res = curl_easy_perform(curl);
        printf("OK:%d\n", res);
		if(strstr(response_buffer,"是")!=NULL){
			printf("same\n");
		}else{
			printf("different\n");
		}
        curl_easy_cleanup(curl);
    }

    free(postString);
    return true;
}

int main(void) {
    postUrl();
    return 0;
}

运行测试

gcc demo8.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib -lcurl

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 00:36:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 00:36:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 00:36:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 00:36:03       18 阅读

热门阅读

  1. 【frp】新版本 frp 参考配置分享

    2024-03-12 00:36:03       20 阅读
  2. C++初学

    C++初学

    2024-03-12 00:36:03      19 阅读
  3. CompletableFuture的使用

    2024-03-12 00:36:03       19 阅读
  4. 复习C++

    2024-03-12 00:36:03       22 阅读
  5. SQL 函数

    2024-03-12 00:36:03       21 阅读
  6. Git - Protocol

    2024-03-12 00:36:03       21 阅读
  7. Linux基础命令

    2024-03-12 00:36:03       19 阅读
  8. 【C#语言入门】16. 委托详解

    2024-03-12 00:36:03       19 阅读