選擇ELFBOARD ELF 1開發板作為核心硬體平台,並利用連線USB介面的攝像頭採集和識別車牌資訊。 一旦車牌識別成功,系統將觸發綠燈指示,並將識別出的車牌號實時傳輸到手機應用程式。 在車牌識別技術方面,提供OCR(Optical Character Recognition)服務,確保準確高效地讀取車牌資料。 同時,該移動應用程式使用J**a程式語言開發,可以輕鬆接收和檢視識別結果。
一車牌識別的實現方法。
一、車牌識別平台介紹
本次車牌識別的實現方案是通過智慧型雲平台實現的,具體實現方法如下:進入智慧型雲網頁->選擇文字識別-車牌識別
進入車牌識別頁面後,您可以通過閱讀技術文件來學習如何使用車牌識別。
2. 安裝 OpenSSL
由於智慧型雲是從libcurl通過HTTPS訪問的,而HTTPS訪問需要OpenSSL支援,所以首先編譯OpenSSL。
wget xvf openssl-1.1.1a.tar.gz./configmakesudo make install3. 安裝 curl
wget -xjf curl-7.71.1.tar.bz2cd curl-7.71.1/./configure --prefix=$pwd/_install_arm --host=arm-linux-gnueabihf --with-openssl#.configure --prefix=$pwd install gcc --with-openssl 為了在本地執行,使用 gcc 編譯,make make install4.車牌識別流程在執行此步驟之前,請閱讀如何使用智慧型雲車牌識別)。
在本地實現之前,可以通過平台提供的**驗證方式進行驗證,如下圖所示,需要輸入訪問令牌(通過閱讀文件就知道如何獲取)和旁邊乙個車牌的base64編碼字串進行**識別。
實現車牌識別的本地方法需要將識別**複製到本地計算機,並且需要實現將**轉換為base64編碼的功能,具體如下:
#include #include #include #include #include #include #include #include #include #include #include inline size_t onwritedata(void * buffer, size_t size, size_t nmemb, void * userp) std::string getfilebase64content(const char * path, bool urlencoded=false) }file_read.close();if(i) if (urlencoded) ret = curl_escape(ret.c_str(),ret.length())return ret;} std::string performcurlrequest(const char *pic_path, const std::string &token) if (curl) curl_easy_cleanup(curl); free(web_curl); return result;} int main(int argc, char *ar**)return 0;}彙編
gcc democar.c -i ./curl-7.71.1/_install_gcc/include/ -l ./curl-7.71.1/_install_gcc/lib/ -l curl編譯完成後,通過SCP將檔案拷貝到ELF 1開發板執行,這樣本地車牌**可以通過HTTPS傳送到智慧型雲進行識別,並返回識別結果,完成車牌識別。
注意:在此處執行時,可能會出現 CA 證書驗證失敗。
root@elf1:~# ./a.outok:60只需執行日期 --s="2024-01-12 21:40:00"只需正確設定時間即可。
第二移植 mjpg-streamer
在上一章中,實現了對本地車牌**的識別,所以如果需要通過攝像頭識別車牌,需要使用MJPG-streamer來實現,使用USB攝像頭進行識別。
這裡就不解釋了mjpg-streamer是什麼,大家可以自己檢視一下,這裡只是介紹一下將mjpg-streamer移植到elf 1開發板的過程。
1.編譯jpeg(1) *JPEG原始碼存檔**:IJGorg/files/(2) tar -xvf jpegsrc.v8b.tar.gz(3) 來編譯配置。
cd jpeg-8d./configure --prefix=$pwd/_install --host=arm-linux-gnueabihfmake -j8make install2. 編譯 mjpg-streamer1) **mjpg-streamer 原始碼包。
*:sourceforge.net/projects/mjpg-streamer/
svn checkout mjpg-streamer-code(2)tar -xvf mjpg-streamer.tar.gz(3) 配置。
cd mjpg-streamer-code/mjpg-streamer/plugins/input_uvcvim makefile開啟生成檔案並對其進行修改,如下所示
4)編譯mjpg-streamer,因為mjpg-streamer預設是用gcc編譯的,所以需要先把gcc改成自己的交叉編譯工具,先安裝你需要的庫。
sudo apt install graphicsmagick-imagemagick-compatsudo apt install imagemagick-6.q16sudo apt install imagemagick-6.q16hdri有兩種方法可以更改 GCC:方法1:
cd ~/mjpg-streamer-code/mjpg-streamermake cc=arm-linux-gnueabihf-gcc方法2:
find -name "makefile" -exec sed -i "s/cc = gcc/cc = arm-linux-gnueabihf-gcc/g" {}grep "arm-linux-gnueabihf-gcc" * nr搜尋當前目錄及其子目錄下的所有 makefile 檔案,並將 makefile 中的 cc 變數設定為 arm-linux-gnueabihf-gcc。 (注意:。arm-linux-gnueabihf-gcc 需要替換為自己的交叉編譯工具。 )
如下圖所示,所有目錄下 makefile 中的 cc 等於交叉編譯工具集。
完成上述步驟後,編譯 **:
make -j8編譯完成後,將生成以下 **:
so:動態庫。
MJPG streamer:提供可執行命令。
www:網路攝像頭輸出的網頁。
5) 移植到 ELF 1 開發板。
scp -r mjpg-streamer/ [email protected]:~(6)驗證功能。
登入 ELF 1 開發板並執行 MJPG 流處理器
cd mjpg-streamerexport ld_library_path=$ld_library_path:~/mjpg-streamer ./mjpg_streamer
當開發板執行MJPG流光成功後,在瀏覽器中輸入開發板的IP位址和埠號8080,例如我的是192168.0.在106:8080,點選流選項,在相機中顯示實時畫面,如下圖所示。
這樣,mjpg流光的移植就完成了,可以使用mjpg流光來實現一些具體的要求,比如開啟攝像頭**:
mjpg_streamer -i "input_uvc.so -d /dev/video2 -f 30 -q 90 -n" -o "output_http.so -w /opt/www"擷取相機的螢幕截圖:
wget -o ./1.jpg例如,攝像頭中的圖片是車牌資訊,它是從攝像頭中的實時圖片中捕獲到區域性區域,然後上傳到智慧型雲的後台進行識別,從而通過攝像頭完成車牌識別。
第三Android 應用的實現
Android應用的實現非常簡單,主要功能是在應用上顯示成功識別的車牌號。 具體實現方式是,當 ELF 1 開發板識別成功車牌後,可以通過套接字將車牌傳送到 Android 應用。 由於這部分**比較簡單,大致如下。
Android 端的 1. XML** 實現
這部分XML只實現了兩個函式,Button用於顯示車牌號的提示,TextView用於顯示識別的車牌號。 2. Android 套接字實現
private handler handler;private textview textview; @overrideprotected void oncreate(bundle s**edinstancestate) new thread(new runnable() catch (ioexception e) }start();上面的段落**通過socket實現了來自開發板的車牌資料,並將其顯示到textview中。
3. ELF 1 開發板實現
開發板的主要目的是通過socket將識別成功的車牌號傳送到Android APP,**如下:
int main(int argc, char *ar**)struct sockaddr_in serv_addr; serv_addr.sin_family = af_inet; serv_addr.sin_addr.s_addr = inet_addr("192.168.0.104"); serv_addr.sin_port = htons(8374); if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) 0) return 1; if (listen(sockfd, 5) <0) return 1; struct sockaddr_in cli_addr; socklen_t clilen = sizeof(cli_addr); int newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen); if (newsockfd < 0) std::cerr <四、總結
整個專案的識別流程如下圖所示,先執行程式,啟動攝像頭執行,然後獲取攝像頭中的實時圖片進行識別,識別成功後會檢索到車牌的關鍵詞並上傳到手機APP,這是整個專案的關鍵操作流程。
以上所有內容均由elfboard的共同創作者提供,所有共享內容僅用於學習和交流目的,嚴禁任何商業用途。 )