嵌入式程式除錯與opencv影像庫

iostreamhvoid發表於2020-10-31

一 . Ubuntu上的GDB

GDB : GNU Debugger,是GNU工程為GNU作業系統開發的 偵錯程式,但它的使用不侷限於GNU作業系統, GDB可以執行 在UNIX、Linux甚至Microsoft Windows

1.gdb除錯舉例

建立gdb.c(程式碼如下)

#include <stdio.h> 
void ShowRevertNum(int iNum)
 {
   while (iNum > 10)
   {
      printf("%d", iNum % 10);              
      iNum = iNum / 10;
   }
    printf("%d\n", iNum);
   }
   int main(void) 
   {
             int iNum;   
             printf("Please input a number :");      
             scanf("%d", &iNum);  
             printf("After revert : ");     
             ShowRevertNum(iNum); 
   }

用gdb除錯
gcc -o test -g gdb.c
gdb test
在這裡插入圖片描述
在這裡插入圖片描述

2.認識gdb命令

file裝入想要除錯的可執行檔案。
kill 終止正在除錯的程式。
list 列出產生執行檔案的原始碼的一部分。
next 執行一行原始碼但不進入函式內部。
step 執行一行原始碼而且進入函式內部。
run 執行當前被除錯的程式。
c 繼續執行程式。
quit 終止gdb。 • watch 使你能監視一個變數的值而不管它何時被改變。
backtrace 棧跟蹤,查出程式碼被誰呼叫。
print 檢視變數的值。
make 使你能不退出gdb就可以重新產生可執行檔案。
shell 使你能不離開gdb就執行UNIX shell命令。
whatis 顯示變數或函式型別。
break 在程式碼裡設斷點,這將使程式執行到這裡時被 掛起。
info break顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被除錯檔案的詳細資訊。
info func顯示所有的函式名稱。
info local 顯示當函式中的區域性變數資訊。
info prog 顯示被除錯程式的執行狀態。
delete [n] 刪除第n個斷點。
disable[n] 關閉第n個斷點。
enable[n] 開啟第n個斷點。
ptype顯示結構定義。
set variable 設定變數的值。
call name(args)呼叫並執行名為name,引數為args的函式。
Finish 終止當前函式並輸出返回值。
eturn value停止當前函式並返回value給呼叫者。

二 .opencv的操作

1.opencv的安裝

在官網下載opencv3.4.10
在這裡插入圖片描述

2.opencv開啟照片的操作

(1) 讀入

然後將它移到home,並解壓,輸入unzip opencv-3.4.1.zip,進入解壓後的檔案包。
在這裡插入圖片描述

(2) 安裝和配置

安裝依賴庫和cmake

在這裡插入圖片描述

進入資料夾進行配置(cd my_build_dir)

cmake一下(cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/use/local …)
在這裡插入圖片描述
中間曾出現無法cmake的情況, 需要sudo apt-get install build-essential
在這裡插入圖片描述

執行命令,漫長的編譯過程
在這裡插入圖片描述

執行命令(sudo make install)
sudo make install 執行完畢後OpenCV編譯過程就結束了,接下來就需要配置一些OpenCV的編譯環境首先將OpenCV的庫新增到路徑,從而可以讓系統找到

(sudo gedit /etc/ld.so.conf.d/opencv.conf) 執行此命令後開啟的可能是一個空白的檔案,不用管,只需要在檔案末尾新增 /usr/local/lib
在這裡插入圖片描述

儲存回到命令列介面,執行如下命令使得剛才的配置路徑生效
sudo ldconfig
配置bash
sudo gedit /etc/bash.bashrc

在最末尾新增
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
在這裡插入圖片描述

儲存,執行如下命令使得配置生效
source /etc/bash.bashrc
更新
sudo updatedb

至此所有配置完成

(3) Linux下程式設計

新建mytest檔案,然後建立test.cpp(cd opencv-3.4.1)(mkdir mytest)(touch test.cpp)(sudo gedit test.cpp)這幾步特別是最後一步不能寫錯。

程式碼是

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
        CvPoint center;
    double scale = -3; 
        IplImage* image = cvLoadImage("lena.jpg");
	argc == 2? cvLoadImage(argv[1]) : 0;

        cvShowImage("Image", image);

        if (!image) return -1; 	center = cvPoint(image->width / 2, image->height / 2);
	for (int i = 0;i<image->height;i++)
	for (int j = 0;j<image->width;j++)
	{
	                double dx = (double)(j - center.x) / center.x;
			double dy = (double)(i - center.y) / center.y;
			double weight = exp((dx*dx + dy*dy)*scale);
			uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
			ptr[0] = cvRound(ptr[0] * weight);
			ptr[1] = cvRound(ptr[1] * weight);
			ptr[2] = cvRound(ptr[2] * weight);
	}
        Mat src;Mat dst;
	src = cvarrToMat(image);
	cv::imwrite("test.png", src);
	cvNamedWindow("test",1);  	imshow("test", src);
	 cvWaitKey();
	 return 0;
}


儲存並編譯

gcc test.cpp -o test pkg-config --cflags --libs opencv
然後出現這種情況
在這裡插入圖片描述
要把gcc改成g++,然後執行./test,出現以下情況
在這裡插入圖片描述

此時,根據提示先安裝一下 “libgtk2.0-dev” 和 “pkg-config”,然後在重新 make 一下

sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
cd ~/opencv3.4.3/my_build_dir/
rm -rf *
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
sudo make -j4
sudo make install

但是此時我發現選錯了,應該在mytset下,之前我是在my_build_dir。
在這裡插入圖片描述
經歷一番挫折後來到這裡,發現執行無結果,最後才發現是自己粗心的問題,圖片的名字與test裡的名字不符合/(ㄒoㄒ)/~~
在這裡插入圖片描述

3.opencv上開啟攝像頭操作

(1) 程式設計

新建一個 test4.cpp 檔案

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
 VideoCapture capture(0);
  while(1)
  {
   Mat frame;
     capture >> frame; 
     imshow("讀取視訊幀",frame);
    if(waitKey(30)==27)
    {
    break;
    }
  }
   system("pause");
     return 0;
}

然後檢查切換usb2,0或者3.0以及攝像頭是否連線

(2) 連線

然後檢查切換usb2,0或者3.0以及攝像頭是否連線
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

都準備好後,開啟cheess,發現還是黑屏,顯示沒有裝置,這裡花了很多時間,在同學的提醒下,才注意到自己的vm版本有點低了(15.0),於是找老師要了15.5.2版本的,安裝後重新執行,就成功了。

(3) 執行

g++ test4.cpp -o test4 pkg-config --cflags --libs opencv //建立可執行檔案
./test1 //執行檔案

在這裡插入圖片描述

4.opencv開啟視訊操作

(1)準備工作

一、安裝 ffmpeg
a、支援庫的安裝
sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev
b、下載ffmpeg原始碼包,並將下載檔案移到 home 目錄下,解壓
unzip FFmpeg-release-3.4.zip
c、進入解壓目錄
cd FFmpeg
./configure --disable-yasm --enbale-shared --prefix=/usr/local/ffmpeg
在這裡插入圖片描述
環境配置一直出問題,解決不了,先放著。

(2)程式設計

(3)執行

(4)補充

相關文章