1. 程式人生 > >樹莓派+Qt+影象識別+串列埠傳輸

樹莓派+Qt+影象識別+串列埠傳輸

CAMsearch.pro

QT += core
QT -= gui

TARGET = test
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp



INCLUDEPATH +=/usr/local/include \
               /usr/local/include/opencv \
               /usr/local/include/opencv2

LIBS +=/usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so \
        /usr/local
/lib/libopencv_imgproc.so \ /usr/local/lib/libopencv_imgcodecs.so\ /usr/local/lib/libopencv_videoio.so \ /usr/local/lib/libopencv_video.so \ /usr/local/lib/libopencv_videostab.so \ /usr/local/lib/libopencv_calib3d.so \ /usr/local/lib/libopencv_features2d.so\ /usr/local/lib/libopencv_flann.so \ /usr/local
/lib/libopencv_ml.so \ /usr/local/lib/libopencv_objdetect.so \ /usr/local/lib/libopencv_photo.so \ /usr/local/lib/libopencv_shape.so \ /usr/local/lib/libopencv_stitching.so \ /usr/local/lib/libopencv_superres.so LIBS +=-lwiringPi

main.cpp

#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include <string.h> #include <stdlib.h> #include <stdio.h> #include <wiringPi.h> #include <wiringSerial.h> #include <iostream> #include<sys/stat.h> #include<unistd.h> using namespace std; using namespace cv; int main(void) { sleep(1);//延時1秒 /*-------------初始化變數--------------*/ Mat frame; RNG rng(12345); vector<vector<Point> > contours; //所有輪廓 vector<Vec4i> hierarchy; int fd,xxx,yyy,dx,dy; char string[4],str[6],str1[6]; /*-------------初始化環境--------------*/ if(wiringPiSetupSys()<0)return 1;//初始化wiringPi VideoCapture capture(0);//開啟攝像頭 if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; } /*-------------主迴圈--------------*/ while (capture.read(frame)) { if (frame.empty()) { printf(" --(!) No captured frame -- Break!"); break; } capture >> frame; //從攝像頭取一幀快取到frame /*-------------影象處理部分-------------*/ Mat proimage = frame; cvtColor(proimage, proimage, CV_BGRA2GRAY); blur(proimage, proimage, Size(5, 5)); Canny(proimage, proimage, 50, 100); //canny邊緣檢測 adaptiveThreshold(proimage, proimage, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 7, 7); //自適應二值化 /*-------------影象識別部分--------------*/ Mat Findallcontours = proimage; findContours(Findallcontours, contours,CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); //提取所有的輪廓存到contours vector<RotatedRect> possibleObj; //可能的目標 vector<RotatedRect> target;//最終目標 for (size_t i = 0; i < contours.size(); i++) { size_t count = contours[i].size(); //所有的輪廓數量 if (count < 50)continue;//排除過小的輪廓 if (count > 1640)continue;//排除過大的輪廓 Mat pointsf; Mat(contours[i]).convertTo(pointsf, CV_32F); RotatedRect box = fitEllipse(pointsf);// 橢圓擬合 if (MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height)*1.2)continue;//選出接近園的輪廓 possibleObj.push_back(box); //可能的目標放到possibleObj /*當前box與之前所有的possibleObj作比較*/ for (int p = 0; p < possibleObj.size(); p++) { float d = powf((possibleObj[p].center.x - box.center.x), 2) + powf((possibleObj[p].center.y - box.center.y), 2); d = sqrtf(d); //兩個圓心的歐式距離 bool flag = true; if(possibleObj[p].size == box.size){flag = false;} //排除自身 if (d <20&&flag) { /*半徑兩倍*/ if(((1.7<possibleObj[p].size.width/box.size.width) && (possibleObj[p].size.width / box.size.width<2.4)) || ((1.7<box.size.height / possibleObj[p].size.height) && (box.size.height / possibleObj[p].size.height<2.4))) { target.push_back(possibleObj[p]); target.push_back(box); //符合條件的輪廓放入target } } } } /*-------------輪廓繪製--------------*/ Mat drawing = Mat::zeros(frame.size(), CV_8UC3); for (int p = 0; p < possibleObj.size(); p++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); ellipse(drawing, possibleObj[p], color, 2, 8); } for (int t = 0; t < target.size()/2; t++) { Scalar color = Scalar(0, 0, 255); ellipse(frame, target[t], color, 2, 8); /*以攝像頭為原點,輸出xy二軸座標 在opencv,影象座標是以左上角為原點的*/ xxx=int(target[t].center.x);dx=xxx-proimage.cols/2; yyy=int(target[t].center.y);dy=proimage.rows/2-yyy; sprintf(str,"%s%d%s","X",dx,"R"); sprintf(str1,"%s%d%s","Y",dy,"R");//字串拼接,傳輸協議x軸X***R,y軸Y***R printf(":%s,%s\n", str, str1); /*開啟串列埠裝置,傳送座標字串,波特率9600*/ if ((fd = serialOpen("/dev/ttyS0", 9600)) < 0) { printf("serial doesn't open,return %d", fd); } serialPrintf(fd,str); delay(10); serialPrintf(fd,str1); serialClose(fd);//清快取 } int c = waitKey(10); if ((char)c == 27) { break; } // escape } capture.release(); return 0; }

測試

這裡寫圖片描述
這裡寫圖片描述

相關推薦

樹莓+Qt+影象識別+串列傳輸

CAMsearch.pro QT += core QT -= gui TARGET = test CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp

樹莓3b與電腦串列互相通訊進行資料傳輸的配置過程

    我們經常需要用串列埠來互發訊息,但是樹莓派的串列埠不像微控制器那樣,稍微有點麻煩。本文參考彙總網上的關於樹莓派串列埠相關資料,快速設定好串列埠。參考連結:1.https://blog.csdn.net/qq_31396093/article/details/58640

4、樹莓連線USB轉串列的使用

      樹莓派上自帶一個串列埠,用於連線藍芽或是串列埠命令列,串列埠資源很少,對於嵌入式的應用來說串列埠裝置很多,需要的串列埠數量也很多,因為通過USB外接串列埠是一個不錯的選擇。樹莓派的 raspberry 2018.04.18 stretch版本的系統中已經

樹莓 零 Zero W 串列SSH登入和無線配置

新的raspberry pi,刷了RetroPi,但是無法識別usb hub下的鍵盤,直接插鍵盤就可以,但是用hub就不行,試了很多方法無果。 於是先嚐試ssh登入到系統。但是沒有網絡卡所以網線無法直連,而板載wifi沒初始化配置過,所以也連線不了,只有通過硬體串列埠來。 參照網上方法

樹莓---wiringPi串列使用(win10+樹莓3+usb轉串列

參考 準備 在樹莓派上用Qt寫串列埠傳送資料的程式 serialTEST.pro QT += core QT -= gui TARGET = test CONFIG +=

我的Raspberry Pi/樹莓有線網和無線網接通了------不需要樹莓顯示器,鍵盤,滑鼠,串列

       以前, 總是登入公司的linux伺服器, 有時候, 因為許可權問題, 玩得並不爽, 甚至連伺服器長得什麼樣,物理位置在哪裡都不知道, 當然, 也沒必要知道。         之後, 經常用ssh/串列埠/adb登入公司某linux/android裝置,進行操作

樹莓與Arduino的串列通訊

樹莓派B+擁有4個USB口,而Arduino正好有USB轉串列埠,這樣我們就能夠很容易的利用這一對介面來實現樹莓派與Arduino之間的串列埠通訊。 arduino端的程式: String rec

樹莓3B Wiring Pi 串列操作

Wiring Pi是為樹莓派提供的GPIO的介面庫,我目前只使用了串列埠的介面,下面也只介紹一下串列埠的使用。 串列埠操作提供了開啟串列埠、讀取資料、傳送資料、關閉串列埠介面。 int fd; if(wiringPiSetup() < 0)

樹莓實現USB TTL串列通訊

手上有個CCD Camera(Barcode Reader/Scanner Module),它是通過RS232通訊的,用RS232轉USB的轉接線連線樹莓派,即可完成硬體連線。對於串列埠通訊,可以通過pyserial實現

樹莓3的除錯串列問題的不完美解決:讓藍芽與除錯共存

問題 因為RaspberryPi3的BT與Debug串列埠共用,導致同一時間只能有一個可以使用,儘管也可以使用軟的UART1來控制BT,但是這樣子的話需要將CPU的頻率固定.  而我們在實際開發中,在mount rootfs之前. 是需要用debug串列埠來檢視kernel

樹莓Android系統下串列GPS模組驅動

由於方案需要Android系統,安裝了konstakang大神編譯的LineageOS14.1 for RPI3,最新版解決了Wifi連線的問題,點32個贊! TB買了個串列埠GPS模組,相容NMEA協議,但是如何整合到安卓系統呢?一通搜尋後找到了解決方法: 1、到http

樹莓3B在Qt下使用串列傳送資料

一、解除串口占用 使用putty的時候神奇的發現樹莓派竟然是支援serial進行操作。試了試,和在ssh下使用沒有多少區別,速度也很快。 樹莓派的串列埠主要也就是被這個佔用了,配置釋放之後才能使用它來進行串列埠通訊。 在命令列裡輸入如下指令:

基於QT:溫度串列影象顯示

用Qt自己寫一個上位機,將串列埠發過來的溫度資訊,顯示出來,並且繪畫出溫度曲線 上圖: 採用QT繪畫曲線,首先當然是採用,qwt控制元件,而Qt沒有自帶的qwt控制元件,所以需要按住移植qwt控制元件方法具體步驟如下: 1. Download and install QT 5.

自動識別串列號|開啟COM9之後的串列|XXX.exe已停止工作|Qt textBrowser滾動條設定到底部

自動識別串列埠號 讀取電腦的登錄檔,將串列埠部分加入到列表中,然後加入到下拉欄中 參考 開啟COM9之後的串列埠 struct PortSettings myComSetting= {BAUD9600,DATA_8,PAR_NONE,

樹莓學習——語音識別和語音朗讀

百度 fpm url .com http 樹莓派 .net method ech 語音識別是基於百度語音REST aip-python-sdk-1.6.0,樹莓派上已安裝pycurl,mplayer。 1:註冊賬號,獲取token 2:提交語音相關信息 3:處理返回的Jso

QT下的串列通訊例項(原始碼可下載QT5下測試通過)

在不瞭解QT下的串列埠如何呼叫的時候,我們可以首先到QT的官網上尋找答案,首先,我們可以訪問:以下網址,搜尋serial port qt,可以得到很多相關的線索 http://doc.qt.io/ 這個QSerialport類十分豐富,比VC中的使用起來更方便,如下網址,我們可以檢視它的所

QT學習筆記——串列通訊

寫一個最簡單的串列埠助手。 QT5以後,編寫串列埠不需要藉助第三方庫了,可以說方便了不少。 先建立QT專案,在.pro檔案里加入下面這行程式碼,不然會沒有串列埠庫額昂你使用的 QT += serialport 然後在標頭檔案mainwindows.h中加入標頭檔案 #inc

ARM-qt 開發,串列配置

在使用終端開發使用串列埠時,配置串列埠的方式尤為重要 1、要使用串列埠就先開啟串列埠 int OpenUartPort(const char *UartPort) { int fd; fd = open(UartPort,O_RDWR|O_NONBLOCK);

QT開發的串列通訊軟體(基於qextserialport工具)

研一上了楊迎澤老師的一門《列車網路與通訊》課程,課程的最後老師給我們分配的小作業居然是寫上位機控制一臺程控電流源,我在查閱了這臺程控電流源的手冊後,發現它的通訊方式是串列埠,而且在串列埠通訊的基礎上指定了一套詳細的通訊協議,基於此,我花了小半天的時間做了一個上位機,完成了任務,這裡主要分享一下基

樹莓QT的安裝和使用

樹莓派QT的安裝和使用 為了安裝就必須將樹莓派的板子連上網,要麼通過wifi或者網口,這裡用的是wifi+VNC遠端登陸進行控制,但其他是一樣的。注意千萬不要把板子的網線口和電腦(同時將本地連線的IP設定成和樹莓派的固定IP在一個頻段)的網線口連結上,同時用VNC去連線板子的固定IP,因