opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境
接著上一節人工智能翔云平臺介紹:
人工智能OCR識別: OCR 是英文Optical Character Recognition的縮寫,意思是光學字符識別,也可簡單地稱為文字識別,是文字自動輸入的一種方法。它通過 掃描 和攝像等光學輸入方式獲取紙張上的文字圖像信息,利用各種 模式 識別算法分析文字形態特征 可以將票據、報刊、書籍、文稿及其它印刷品轉化為圖像信息,再利用文字識別技術將圖像信息轉化為可以使用的計算機輸入技術。可應用于銀行票據、大量文字資料、檔案卷宗、文案的錄入和處理領域。適合于銀行、稅務等行業大量票據表格的自動掃描識別及長期存儲。相對一般文本,通常以最終識別率、識別速度、版面理解正確率及版面還原滿意度4個方面作為OCR技術的評測依據;而相對于表格及票據, 通常以識別率或整張通過率及識別速度為測定OCR技術的實用標準,隨著人工智能的興起,人們在追求讓工作更簡單化,ocr識別技術可以讓從事文字工作的人更加輕松。
人臉識別接口的購買:
首先注冊翔云平臺的賬號,然后進入價格與購買,購買后即可進行程序代碼的編寫進行接口的調用。通過查看開發文檔,要求http請求是post請求。
編寫代碼實現人臉識別:
編譯openssl支持libcurl的https訪問:
- 如果不帶編譯時不帶openssl庫那么無法訪問https的網頁,從網頁端什么也獲取不到。
以下是圖片內容的翻譯:
- 如上圖所示:之前安裝的libcurl庫不支持https的訪問,所以將原先安裝的libcurl庫刪掉,就把_install這個文件夾刪掉即可,然后重新編譯安裝,編譯的時候記得先安裝openssl庫,就安裝在默認位置/usr/local/lib和/usr/lib下面即可,這樣編譯libcurl庫的時候不用指定ssl庫的路徑了。安裝openssl庫的時候可以從官網下載,也可以使用指令:wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz進行下載,wget 是linux的開源工具,可以從網頁上下載內容。
- 下載完成后,tar vxf openssl-1.1.1l.tar.gz解壓文件后,文件夾里面的風格和其他庫的內容差不多,首先閱讀README查看這個庫的一些信息,然后得知庫的安裝和編譯要查看INSTALL文件,如下圖所示,可知使用指令:./config、make、sudo make install可以進行默認位置的編譯和安裝。如果想指定位置則使用指令:./config --prefix=/home/fhn/httphandler/openssl/opssl1(主要包含庫文件和頭文件之類的) --openssldir=/home/fhn/httphandler/openssl/opssl2(主要包含一些配置文件,如果不寫這個將會在opssl1下面創建ssl文件夾去放這些配置文件)其中–prefix選項是配置安裝目錄,如果不配置該選項,安裝后可執行文件默認放在/usr /local/bin,庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc,其它的資源文件放在/usr /local/share,比較凌亂。如果配置了–prefix,如: ./config --prefix=/usr/local/test1安裝后的所有資源文件都會被放在/usr/local/test目錄中,不會分散到其他目錄。使用–prefix選項的另一個好處是方便卸載軟件或移植軟件, 當某個安裝的軟件不再需要時,只須簡單的刪除該安裝目錄,就可以把軟件卸載干凈;移植軟件只需拷貝整個目錄到另外一個機器即可(相同的操作系統下)。
- 將openssl安裝好后,就可以進行支持https的libcurl庫的安裝了,使用指令:./configure --prefix=$pwd/_install --with-ssl、make、sudo make install進行安裝編譯,然后現在的環境就支持了https網頁的訪問。再次使用指令進行編譯即可:gcc demo2.c -o demo2 -I ~/httphandler/curl-7.71.1/_install/include -L ~/httphandler/curl-7.71.1/_install/lib/ -lcurl
base64編碼:
- Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法。可查看RFC2045~RFC2049,上面有MIME的詳細規范。Base64編碼是從二進制到字符的過程,可用于在HTTP環境下傳遞較長的標識信息。采用Base64編碼具有不可讀性,需要解碼后才能閱讀。Base64由于以上優點被廣泛應用于計算機的各個領域,然而由于輸出內容中包括兩個以上“符號類”字符(+, /, =),不同的應用場景又分別研制了Base64的各種“變種”。為統一和規范化Base64的輸出,Base62x被視為無符號化的改進版本。總結:就是一種傳輸格式。
- 相讓圖片傳到網頁端首先要將它轉化為base64編碼的格式,然后進行上傳,liinux有一個自帶的編碼裝換工具,使用指令:base64 圖片路徑就可以將圖片轉化為base64編碼在http環境下進行傳輸
- cookie文件: cookie是一種程序,當它放到硬盤后,就成為一個擴展名為TXT的純文本文件。curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
關于Cookie的一些選項:
CURLOPT_COOKIE:用來指定一個Cookie,用來在之后的http請求中發送這個Cookie。
CURLOPT_COOKIEFILE:告訴libcurl激活cookie引擎,然后讀取指定文件來初始化Cookie,只讀。
CURLOPT_COOKIEJAR:告訴libcurl激活cookie引擎,當easy handle被關閉,保存所有已知的Cookie到cookie jar文件,只寫。
CURLOPT_COOKIELIST:提供單個的Cookie加入內部的Cookie存儲引擎。可以傳遞http頭格式也可以傳遞netscape 格式。這個也可以用來刷新Cookies。
CURLINFO_COOKIELIST:將Cookie信息從內部Cookie存儲里導出,導出格式為鏈表。
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postString); // 指定post內容;傳遞給 CURLOPT_POSTFIELDS 的應該是形如name1=var1&name2=var2,在使用 CURLOPT_POSTFIELDS 時,您不需要使用 CURLOPT_POST 。在這種情況下,請求方法將始終設置為POST,c調用libcurl庫POST請求。
然后進行虛擬機上面的代碼編寫:
#include <unistd.h> #include <stdio.h> #include<string.h> #include<stdlib.h> #include <curl/curl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define true 1 #define false 0 int i=0; long long int size; typedef unsigned int bool; size_t readData( void *ptr, size_t size, size_t nmemb, void *stream) //回調函數 {char* buf2;char buf3[100]={'\0'};char buf[1024]={'\0'};strncpy(buf,ptr,1024);buf2=strstr(buf,"CDATA");buf2=buf2+6;strncpy(buf3,buf2,9);if(strstr(buf,"是")!=NULL){printf("是同一個人\n");}else{printf("不是同一個人\n");}printf("置信度為:%s\n",buf3); } char* makeBase64(char* str1,char* str2)//第一個參數是模板文件的地址,第二個參數是傳入文件的地址 {char* sourceimg;char* type1;char* type2;int sourcefd;type1=(char*)malloc(strlen(str1)+50);type2=(char*)malloc(strlen(str2)+50);memset(type1,'\0',strlen(str1)+50);memset(type2,'\0',strlen(str2)+50);sprintf(type1,"base64 %s > %s",str1,str2);sprintf(type2,"rm %s",str2);sourcefd=open(str2,O_RDWR|O_CREAT,0600);system(type1);size=lseek(sourcefd,0,SEEK_END);sourceimg=(char*)malloc(size+2);memset(sourceimg,'\0',size+2);lseek(sourcefd,0,SEEK_SET);//重新讓光標回到文件頭部read(sourcefd,sourceimg,size);close(sourcefd);if(i>=1)system(type2);i=i+1;if(i==10)i=i-9;return sourceimg; } bool postUrl() {CURL *curl;CURLcode res;int typeId=21;char* img1;char* img2;char* format="xml"; //返回格式(xml或者json),如果format為空,則默認返回xml char* postString;char* key="翔云平臺獲取";char* secret="翔云平臺獲取";img1=makeBase64("/home/fhn/httphandler/img/2019270100013390_0_1.jpg","/home/fhn/httphandler/img/source");img2=makeBase64("/home/fhn/httphandler/img/2019289045205325_0_1.jpg","/home/fhn/httphandler/img/compare");int len=strlen(key)+strlen(secret)+sizeof(typeId)+strlen(format)+strlen(img1)+strlen(img2);postString=(char*)malloc(len);memset(postString,'\0',len);sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",img1,img2,key,secret,typeId,format);curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postString); // 指定post內容curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定翔云平臺的urlcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData); //當有數據回來的時候調用回調函數res = curl_easy_perform(curl);curl_easy_cleanup(curl);}free(img1);free(img2);return true; } int main() {postUrl(); }樹莓派簡單配置CSI攝像頭:
-
測試環境: 硬件:樹莓派3B/3B+、系統:Raspberry Debian 9 / Debian 10、已安裝好CSI攝像頭的樹莓派。
-
首先使用"ls"指令來查看是否存在vchiq設備節點(如果沒有,則可能是內核或者設備硬件存在問題,可嘗試重刷系統或更換硬件):
-
運行"vcgencmd get_camera"查看當前攝像頭是否可用,如果detected=0,說明攝像頭模塊沒接好,重新排查下硬件。detected=1則說明CSI攝像頭接入正常。supported=1說明攝像頭已經使能,攝像頭已經可以使用。supported=1則說明CSI攝像頭沒有使能。需要使能下攝像頭模塊。
-
運行"sudo raspi-config"命令使能樹莓派CSI攝像頭:
-
有些程序采用V4L2編程,會訪問到/dev/videoX設備,因此需要添加UVC驅動,針對樹莓派3B/3B+可以采用如下的方法添加bcm2835-v4l2驅動:
-
運行raspistill -o ~/seeFace/image.jpg即可成功拍照并保存,可選擇保存路徑,更多參數使用raspistill --help
-
移除從原代碼安裝的程序、刪除庫就在源代碼哪里執行sudo make uninstall
然后在樹莓派上面操作和虛擬機相同的操作(先編譯、安裝支持庫,然后編寫代碼):
- 在樹莓派上面輸入指令:sudo apt install libssl-dev、 sudo apt install libcurl4-openssl-dev 即可快速安裝libcurl和openssl庫,可以不使用在虛擬機那樣方法,但是我沒有嘗試這個方法。
- 我在樹莓派上使用的是在虛擬機那樣的方法,遇到了很多問題,大概就是找不到庫吧,解決過程中:sudo apt-get update(該命令會訪問源列表里的每個網址,并讀取軟件列表,然后保存在本地電腦。)、sudo apt-get upgrade(該命令,會把本地已安裝的軟件,與剛下載的軟件列表里對應軟件進行對比,如果發現已安裝的軟件版本太低,就會提示你更新。)然而并沒有什么卵用,問題如下:
- 最終將在樹莓派上裝的openssl庫和libcurl庫使用指令:sudo make uninstall卸載,然后重新安裝openssl庫并且這次安裝的是下圖的版本,就可以編譯并且使用了(但不知道具體原因)。
- 過程中還遇到樹莓派攝像頭出現下面錯誤:
- 解決: 使用指令:vcgencmd get_camera查看是否能識別設備,出現結果:supported=1 detected=0, 說明只有輸出,并沒有檢測到設備,然后使用指令:sudo raspi-config進入到樹莓派基本設置界面,將Camera Enable、SSH Enable、VNC Enable、SPI Enable、I2C Enable、Serial Enable、1-Wire Enable再次檢測出現下列情況問題就解決:supported=1 detected=1
使用樹莓派播放音頻文件:
-
登錄樹莓派,打開終端,執行sudo raspi-config命令
-
選擇第7項Advanced Options高級選項
-
選擇第4項Audio音頻
-
可以看到有三種聲音配置,(1)【Auto】-自動選擇;(2)【Force 3.5mm (‘headphone’) jack】-從3.5毫米(“耳機”)插孔輸出;(3)【Force HDMI 】-從HDMI輸出
安裝音樂播放軟件:
- 要保證樹莓派可以正常連接網絡,我們使用的omxplayer音樂播放軟件需要從網絡下載安裝
- 輸入指令sudo apt-get install omxplayer,下載安裝omxplayer
- 進入MP3文件夾,使用omxplayer -o local mp3文件地址播放音樂, -o: Output device must be local',hdmi’, both' oralsa’
樹莓派安裝中文輸入法:
- 安裝中文字庫:
- 安裝中文輸入法:
- 切換語言環境:sudo raspi-config按方向鍵選擇【localisation options】
- 選擇【Change Locale】
- 按方向鍵往下翻,直到找到"zh_CN UTF-8" , 按下空格鍵將其打上*號,回車
- 選擇語言環境"zh_CN UTF-8"
- 配置完成,重啟樹莓派:sudo shutdown -r now
- 另外,如果用vim編輯保存出現“no write since last change",無法保存,可以先退出,然后重新進入編輯,保存時指定編碼方式,如下:w ++enc=utf-8
- 因為我使用的SecureCRT,所以還要將終端界面配置為中文編碼:
然后進行代碼的編寫(人臉識別成功后,播報語音,控制繼電器):
#include <unistd.h> #include <stdio.h> #include<string.h> #include<stdlib.h> #include <curl/curl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <wiringPi.h> #define true 1 #define JD 25 #define false 0 int i=0; long long int size; typedef unsigned int bool; void gpioInit() {pinMode(JD,OUTPUT);digitalWrite(JD,HIGH); } size_t readData( void *ptr, size_t size, size_t nmemb, void *stream) {char* buf2;float believe;char buf3[100]={'\0'};char buf[1024]={'\0'};strncpy(buf,ptr,1024);printf("%s\n",buf);buf2=strstr(buf,"CDATA");buf2=buf2+6;strncpy(buf3,buf2,3);believe=(float)atof(buf3);if(believe>0.6){system("omxplayer -o local ~/seeFace/img/success.mp3");digitalWrite(JD,LOW);}else{system("omxplayer -o local ~/seeFace/img/fail.mp3");} } char* makeBase64(char* str1,char* str2) {char* sourceimg;char* type1;char* type2;int sourcefd;type1=(char*)malloc(strlen(str1)+50);type2=(char*)malloc(strlen(str2)+50);memset(type1,'\0',strlen(str1)+50);memset(type2,'\0',strlen(str2)+50);sprintf(type1,"base64 %s > %s",str1,str2);sprintf(type2,"rm %s",str2);sourcefd=open(str2,O_RDWR|O_CREAT,0600);system(type1);size=lseek(sourcefd,0,SEEK_END);sourceimg=(char*)malloc(size+20);memset(sourceimg,'\0',size+20);lseek(sourcefd,0,SEEK_SET);read(sourcefd,sourceimg,size+20);close(sourcefd);if(i>=1){system(type2);}i=i+1;if(i==10){i=i-9;}return sourceimg; } bool postUrl() {CURL *curl;CURLcode res;int typeId=21;char* img1=NULL;char* img2=NULL;char* format="xml";char* postString;char* key="平臺獲取";char* secret="平臺獲取";img1=makeBase64("/home/pi/seeFace/img/imagesource.jpg","/home/pi/seeFace/img/source");img2=makeBase64("/home/pi/seeFace/img/image.jpg","/home/pi/seeFace/img/compare");int len=strlen(key)+strlen(secret)+sizeof(typeId)+strlen(format)+strlen(img1)+strlen(img2);postString=(char*)malloc(len);memset(postString,'\0',len);sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",img1,img2,key,secret,typeId,format);curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postString);curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);res = curl_easy_perform(curl);curl_easy_cleanup(curl);}free(img1);free(img2);return true; } int main() {int i=wiringPiSetup();if(i==-1){printf("GPIO Init fail\n");}gpioInit();system("raspistill -t 1000 -o ~/seeFace/img/image.jpg");system("convert -resize 1024x768 ~/seeFace/img/image.jpg ~/seeFace/img/image.jpg");postUrl(); }- 使用指令:gcc face.c -o face -I /home/pi/libcurl/curl-7.71.1/_install/include -L /home/pi/libcurl/curl-7.71.1/_install/lib/ -lcurl -lwiringPi編譯后出現問題:
- 官網查閱錯誤代碼含義:
- 然后嘗試縮小圖片分辨率,再次進行嘗試,然后即可正常訪問。
- 使用工具convert進行圖片分辨率的改變
- 使用指令:sudo apt install imagemagick進行安裝convert的工具包imagemagick
- 然后使用指令:convert -resize 1024×768 被改圖片地址 改后的圖片地址1024×768中間的是小寫的x。
總結
以上是生活随笔為你收集整理的opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html:(6):body标签和p标签
- 下一篇: JAVA SE、EE、ME,JRE、JD