当前位置: 首页 > news >正文

网站建设的费用估算网络营销的特点及方式有哪些

网站建设的费用估算,网络营销的特点及方式有哪些,手机网站设计框架,甘肃省建设监理协会 官方网站一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 四、mjpg实现监控识别 五、V4L2 视频设备 Linux 内核模块的一部分 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~…一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 四、mjpg实现监控识别 五、V4L2 视频设备 Linux 内核模块的一部分 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~$ sudo apt-get install -y fswebcamb. 安装完 fswebcam 后可以使用下面的命令来拍照 a) -d 选项用于指定 USB 摄像头的设备节点 b) --no-banner 用于去除照片的水印 c) -r 选项用于指定照片的分辨率 d) -S 选项用设置于跳过前面的帧数 e) ./image.jpg 用于设置生成的照片的名字和路径 orangepiorangepi:~$ sudo fswebcam -d /dev/video0 \ --no-banner -r 1280x720 -S 5 ./image.jpgc. 在服务器版的 linux 系统中拍完照后可以使用 scp 命令将拍好的图片传到 Ubuntu PC 上镜像观看 orangepiorangepi:~$ scp image.jpg test192.168.1.55:/home/test根据实际情况修改 IP 地址和路径d. 在桌面版的 linux 系统中可以通过 HDMI 显示器直接查看拍摄的图片 这里使用fswebcam进行拍照。参考用户手册 首先在/smart_home拍照命名为imageComp.jpg sudo fswebcam -d /dev/video0 --no-banner -r 1280x720 -S 5 ./imageComp.jpg二、根据demo来实现功能点 demo.c 主要的功能是通过摄像头采集人脸数据然后通过 cURL 发送 POST 请求到指定的 API 接口接收 OCR 后台返回的数据。在这个过程中你使用了一些全局变量、文件 I/O、cURL 库等。 以下是一些建议和注意事项 错误处理 在系统调用和库函数调用后最好检查其返回值以确保操作成功。例如你可以在文件打开、内存分配等操作后添加错误检查并在失败时输出错误信息。 函数封装 考虑将一些相关的操作封装成函数以提高代码的模块性和可读性。例如可以将 cURL 相关的初始化和清理操作封装成函数。 全局变量的使用 全局变量在函数间传递数据但过度使用全局变量可能导致代码难以理解和维护。尽量将数据传递作为函数参数以提高函数的可复用性。 内存释放 在使用 malloc 分配内存后确保在不再需要使用该内存时调用 free 进行释放以避免内存泄漏。 字符串操作 在使用字符串拼接函数如 sprintf时确保目标缓冲区足够大以防止缓冲区溢出。 资源释放顺序 在释放资源时注意释放的顺序以避免悬挂指针或资源泄漏。 安全性 尽量避免使用 system 函数来执行外部命令这可能带来安全风险。如果可能的话考虑使用更安全的库函数或 API。 下面是一些可能的改进 // 错误处理函数 void handleError(const char *message) {perror(message);exit(EXIT_FAILURE); }// 初始化 cURL CURL *initCurl() {CURL *curl curl_easy_init();if (!curl){handleError(curl_easy_init failed);}return curl; }// 释放 cURL 资源 void cleanupCurl(CURL *curl) {curl_easy_cleanup(curl); }// 发送 cURL POST 请求 bool sendPostRequest(const char *url, const char *postString, size_t (*writeCallback)(void *, size_t, size_t, void *)) {CURL *curl initCurl();if (!curl){return false;}CURLcode res;// 设置 cURL 选项curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);// 执行请求res curl_easy_perform(curl);// 检查执行结果if (res ! CURLE_OK){fprintf(stderr, curl_easy_perform() failed: %s\n, curl_easy_strerror(res));cleanupCurl(curl);return false;}cleanupCurl(curl);return true; }// 获取人脸数据 char *getFace() {printf(人脸数据采集中...\n);system(sudo fswebcam -d /dev/video0 --no-banner -r 1280x720 -S 5 ./image.jpg);while (access(./image.jpg, F_OK) ! 0){// 等待文件存在}printf(数据采集完毕\n);// 获取 base64 数据char *base64BufFaceRec getBase64FromFile(./image.jpg);remove(./image.jpg); // 采集完成删除防止占内存return base64BufFaceRec; }// 发送人脸数据到 OCR 后台 bool sendFaceToOcr() {char *img1 getFace(); // 图片 base64 流char *img2 getBase64FromFile(/home/orangepi/smart_home/test/imageComp.jpg);char *key JFD5c1iBh9LVqPkkZMqM8Q;char *secret 76f444813fc945bd9543e4d7e086ad87;int typeId 21;char *format xml;// 分配足够的空间int len strlen(key) strlen(secret) strlen(img1) strlen(img2) 128;char *postString (char *)malloc(len);if (!postString){handleError(Memory allocation failed);}// 字符串拼接snprintf(postString, len, img1%simg2%skey%ssecret%stypeId%dformat%s, img1, img2, key, secret, typeId, format);// 发送 POST 请求bool result sendPostRequest(https://netocr.com/api/faceliu.do, postString, readData);// 释放动态分配的内存free(img1);free(img2);free(postString);return result; }// 入口函数 int main(void) {// 发送人脸数据到 OCR 后台if (sendFaceToOcr()){// 处理 OCR 后台返回的数据// ...}return 0; }这个版本进行了一些重构提高了可读性和模块性同时加入了错误处理。你可以根据需要进一步调整。 三、功能点编写编译运行实现 camera.c #include controlDevice.h #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 unistd.hchar ocrReturnBuf[1024] {\0}; // 全局变量用来接收从OCR后台返回的数据// 回调函数读取从OCR后台返回的数据(把从后台的数据拷贝给ocrReturnBuf) size_t readData(void *ptr, size_t size, size_t nmemb, void *stream) {size_t totalSize size * nmemb;// 为了避免溢出计算实际拷贝的长度size_t copySize (totalSize (sizeof(ocrReturnBuf) - 1)) ? totalSize : (sizeof(ocrReturnBuf) - 1);// 拷贝数据到 ocrRetBuf 中memcpy(ocrReturnBuf, ptr, copySize);// 手动添加字符串终结符ocrReturnBuf[copySize] \0;return totalSize; }char *getBase64FromFile(const char *filePath) {char cmd[256] {\0};char *base64Buf NULL;// 使用安全的方式构建命令snprintf(cmd, sizeof(cmd), base64 %s | tr -d \n tmpFile, filePath);if (system(cmd) -1) {perror(Error executing system command);return NULL;}int fd open(./tmpFile, O_RDWR);if (fd -1) {perror(Error opening file);return NULL;}// 计算文件大小int fileLen lseek(fd, 0, SEEK_END);lseek(fd, 0, SEEK_SET);// 动态分配内存base64Buf (char *)malloc(fileLen 1);if (base64Buf NULL) {perror(Error allocating memory);close(fd);return NULL;}memset(base64Buf, \0, fileLen 1);// 读取文件内容到字符串if (read(fd, base64Buf, fileLen) -1) {perror(Error reading file);free(base64Buf);close(fd);return NULL;}close(fd);// 删除临时文件if (remove(tmpFile) -1) {perror(Error deleting temporary file);}return base64Buf; }// 获取人脸数据 char *getFace() {printf(人脸数据采集中...\n);system(sudo fswebcam -d /dev/video0 --no-banner -r 1280x720 -S 5 /home/orangepi/smart_home/test/image.jpg);while (access(./image.jpg, F_OK) ! 0); // 判断是否拍照完毕printf(数据采集完毕\n);// 获取 base64 数据char *base64BufFaceRec getBase64FromFile(./image.jpg);remove(./image.jpg); // 采集完成删除防止占内存return base64BufFaceRec; // 返回刚才拍照的base64 }// 根据文档接口调用方法为post请求 void postUrl() {CURL *curl;CURLcode res;// 根据翔云平台的接口要求 分开定义然后字符串拼接char *img1 getFace(); // 图片base64流char *img2 getBase64FromFile(/home/orangepi/smart_home/test/imageComp.jpg);char *key JFD5c1iBh9LVqPkkZMqM8Q;char *secret 76f444813fc945bd9543e4d7e086ad87;int typeId 21;char *format xml;int len strlen(key) strlen(secret) strlen(img1) strlen(img2) 128; // 分配空间不够会导致栈溢出char* postString (char*)malloc(len);memset(postString, \0, len);//因为postString是一个指针不能用sizeof来计算其指向的大小// 字符串拼接sprintf(postString, img1%simg2%skey%ssecret%stypeId%dformat%s, img1, img2, key, secret, typeId, format);// 初始化 cURLcurl curl_easy_init();if (curl){// 指定cookie缓存文件// if (curl_easy_setopt(curl, CURLOPT_COOKIEFILE, /tmp/cookie.txt) ! CURLE_OK)// {// fprintf(stderr, Failed to set cookie file\n);// return false; // 在设置失败时直接返回// }// 指定post传输内容get请求将URL和postString一次性发送curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);// 指定urlcurl_easy_setopt(curl, CURLOPT_URL, https://netocr.com/api/faceliu.do);// 回调函数读取返回值curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);// 执行请求res curl_easy_perform(curl);if (res ! CURLE_OK) {fprintf(stderr, curl_easy_perform() failed: %s\n, curl_easy_strerror(res));// 处理错误}// 释放 cURL 资源curl_easy_cleanup(curl);}// 释放动态分配的内存free(img1);free(img2);free(postString); }struct Devices camera {.deviceName camera,.justDoOnce postUrl };struct Devices *addCameraToDeviceLink(struct Devices *phead) {if (phead NULL) {return camera;}else {camera.next phead; // 以前的头变成.nextphead camera; // 更新头return phead;} }controlDevice.h #include wiringPi.h //wiringPi库 #include stdio.h #include stdlib.h// 设备结构体 struct Devices //设备类 {char deviceName[128]; //设备名int status; //状态int pinNum; //引脚号// 函数指针用于设备控制int (*Init)(int pinNum); //“初始化设备”函数指针int (*open)(int pinNum); //“打开设备”函数指针int (*close)(int pinNum); //“关闭设备”函数指针int (*readStatus)(int pinNum); //“读取设备状态”函数指针 为火灾报警器准备int (*changeStatus)(int status); //“改变设备状态”函数指针void (*justDoOnce)(); // 仅执行一次的操作struct Devices *next; };struct Devices* addBathroomLightToDeviceLink(struct Devices *phead); //“浴室灯”加入设备链表函数声明 2 struct Devices* addBedroomLightToDeviceLink(struct Devices *phead); //“卧室灯”加入设备链表函数声明 8 struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead); //“餐厅灯”加入设备链表函数声明 13 struct Devices* addLivingroomLightToDeviceLink(struct Devices *phead); //“客厅灯”加入设备链表函数声明 16 struct Devices* addSmokeAlarmToDeviceLink(struct Devices *phead); //“烟雾报警器”加入设备链表函数声明 6 struct Devices* addBuzzerToDeviceLink(struct Devices *phead); //“蜂鸣器”加入设备链表函数声明 9 struct Devices *addCameraToDeviceLink(struct Devices *phead); // “摄像头”加入设备链表 struct Devices *addLockToDeviceLink(struct Devices *phead); // “门锁”加入设备链表 15main.c 在main.c文件里的Command(struct InputCommand* CmdHandler)函数中添加 // OCR 指令执行人脸识别功能进行开门if (strcmp(OCR, CmdHandler-command) 0){tmp findDeviceByName(camera, pdeviceHead);if (tmp ! NULL){tmp-justDoOnce();// 字符串检索 判断翔云后台返回的一大堆字符串中有没有“否”if (strstr(ocrReturnBuf, 否) ! NULL){printf(人脸比对失败\n);}else{printf(人脸比对成功\n);tmp findDeviceByName(lock, pdeviceHead);if (tmp ! NULL){tmp-open(tmp-pinNum);printf(已开门\n);delay(3000);tmp-close(tmp-pinNum);}}}}这里的摄像头只是当作一个设备去用目前实现通过串口指令然后system()进行拍照。然后翔云平台进行人脸对比未实现自动人脸检测。 所以摄像头没有另创线程。但是做视频监控可以另创线程。 这样当串口发送OCR时实现人脸对比并开锁所以没有用线程去做 当然要把camera、lock设备加入设备工厂 注意ocrReturnBuf这个因为要再不同文件调用的全局变量所以要extern 编译运行 gcc *.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -I /home/orangepi/curl-7.71.1/_install/include/ -L /home/orangepi/curl-7.71.1/_install/lib/ -lcurlsudo -E ./a.out运行结果 四、mjpg实现监控识别 mjpg来实现也是一样的 通过前面智能垃圾分类章节【阿里云】图像识别 摄像模块 语音模块 五、V4L2 视频设备 Linux 内核模块的一部分 V4L2 是视频设备 Linux 内核模块的一部分全名是 Video for Linux 2。它提供了一套标准的 API用于控制和管理视频设备比如摄像头、视频捕获卡等。V4L2 的设计旨在与 Linux 内核无缝集成并提供用户空间应用程序与视频设备进行交互的标准接口。 V4L2 的主要特性和功能包括 设备的打开和关闭 使用 V4L2可以打开和关闭视频设备。 格式和尺寸控制 V4L2 允许应用程序查询和设置视频设备支持的不同格式和分辨率。 帧缓冲管理 应用程序可以通过 V4L2 分配、映射和取消映射帧缓冲。 视频捕获和输出 V4L2 允许应用程序启动视频捕获或输出操作并控制捕获或输出的参数。 控制操作 V4L2 提供了对摄像头参数如亮度、对比度、色彩饱和度等的控制。 流 IO 操作 支持单帧和多帧的 I/O 操作用于捕获或输出视频流。 回调函数 V4L2 支持回调函数使得应用程序可以在特定事件发生时得到通知。 V4L2 API 的使用一般包括在用户空间的应用程序中调用相应的系统调用例如 open()、ioctl() 等以与视频设备进行交互。在内核空间V4L2 的实现则通过提供相应的结构体和函数指针来支持。 请注意V4L2 的详细定义和使用方式可能会根据 Linux 内核版本的不同而有所变化因此建议查阅相应版本的内核文档和头文件以获取准确的信息。 在 Linux 上安装和配置 V4L2 通常涉及以下步骤 检查内核支持 确保你的 Linux 内核已启用 V4L2 支持。通常大多数标准的 Linux 内核都包含了 V4L2 模块。你可以通过查看内核配置文件或使用 lsmod | grep videodev 命令来检查是否加载了 videodev 模块。 安装 V4L2 工具 有一些工具可用于测试和配置 V4L2 设备。其中一个常用的工具是 v4l-utils。你可以使用包管理工具安装它例如 sudo apt-get install v4l-utils # 对于基于 Debian 的系统或 sudo yum install v4l-utils # 对于基于 Red Hat 的系统配置设备权限 确保用户具有访问视频设备的权限。你可以将用户添加到 video 组或者通过修改设备文件的权限来实现。设备文件通常在 /dev 目录下例如 /dev/video0。 加载 V4L2 模块 如果你的内核未自动加载 V4L2 模块你可以使用 modprobe 命令手动加载 sudo modprobe videodev或者如果你使用的是特定的摄像头或设备驱动程序可能需要加载相关的模块。 测试设备 使用 v4l2-ctl 工具或其他 V4L2 相关工具测试你的视频设备。例如你可以使用以下命令查看设备的基本信息 v4l2-ctl --list-devices或者使用以下命令查看摄像头的支持格式和参数 v4l2-ctl --list-formats-ext -d /dev/video0这些步骤提供了一个基本的 V4L2 安装和配置的概述。具体的步骤可能会因你的系统和设备而有所不同。请查阅相关的文档和手册以获取更详细的信息。
http://www.dnsts.com.cn/news/185360.html

相关文章:

  • 上海企业网站建设方案佛山网站如何制作
  • 怎么制作网站弹出广告如何做app推广
  • 垫江网站建设报价聊城营销网站建设价格
  • 网站建设公司 选中企动力公司郑州官网搭建
  • 网站关键词几个建设部网站最新政策
  • 广西建设厅网站彭新唐西渡网站建设
  • 做外贸生意上哪个网站自己主机做标签电影网站
  • 电子产品网站建设策划做文化传播公司网站
  • 校园网站制作模板vs做网站加背景
  • 泰兴市城乡住房建设局网站重庆招标信息网官网查询
  • 网站建设的战略作用西安排名seo公司
  • 溧阳常州做网站手机优化如何弄到100
  • 企业网站建设规划书pptwordpress支付可见公众号收款
  • 大朗东莞网站建设全国安装平台有哪些
  • 邹城市住房和建设局网站无锡网站建设seo
  • 为什么用开源建站设计网页通常使用什么语言
  • 自己制作网站app网站建设收费标准如何
  • 网站监控的软件怎么做网页制作怎么添加视频
  • 组工网站档案数字化建设90设计网站创建时间
  • 自己建网站要学什么上海住房城乡建设网站证件查询
  • c 网站开发下载gs甘肃人社
  • 做棋牌网站违法wordpress导航类网站
  • 蓝色网站特点无需会员免费ppt模板
  • 福州微信营销网站建设产品查询展示型网站
  • 大气网站源码珠海市网站开发公司
  • 成都网站建设龙兵网络网络公司排名哪家专业
  • 网站建设协议书样本js 插件html转换wordpress
  • 软件开发工具排行榜重庆seo整站优化效果
  • 医药公司网站建设备案品牌网站设计视频教程
  • seo网站培训优化怎么做长沙做网站公司哪家