關於在windows,ubuntu,樹莓派上安裝使用opencv

準時不早退的劉文威發表於2020-10-31

1.Ubuntu系統上練習GDB除錯

本節課,我們嘗試運用GBD進行除錯,首先建立一個test2,程式碼如下:
在這裡插入圖片描述

#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);
}

很簡單,是一個反轉數字的函式,但是當輸入值為100時,程式會輸出錯誤,為了找到錯誤,本次我們會使用GDB進行找錯.
在這裡插入圖片描述
首先,執行GDB,將test2放入GDB中
在這裡插入圖片描述
用list將函式顯示完全
在這裡插入圖片描述
由於除法與輸出比較重要,由於錯誤,所以設定他們兩個為斷電,方便實時觀察
在這裡插入圖片描述
在這裡插入圖片描述
經分析,可能是由於100/10環節餘數剛好為10,導致直接輸出了出來,所以最終為010

2.ubuntu上opencv的安裝與使用

2.1opencv的安裝與環境配置

首先,強烈大家安裝vmvare tools,它可以讓你在虛擬機器與本機之間互傳檔案以及互相複製貼上。其次,opencv在國內下載比較慢,可以尋找其他方法下載,在電腦上下載完成後直接拖入了虛擬機器中
(注:由於opencv壓縮包為zip檔案,可用zip解壓語句解壓)

unzip FileName.zip

在這裡插入圖片描述
等待它解壓完畢後進入它的介面,安裝cmake

sudo apt-get install cmake

在這裡插入圖片描述
使用命令依賴庫
在這裡插入圖片描述
在opencv解壓後的檔案中建立一個build檔案,並在build檔案中
在這裡插入圖片描述
輸入sudo make,開始下載
在這裡插入圖片描述
使用sudo make install執行命令在這裡插入圖片描述
將OpenCV的庫新增到路徑,從而可以讓系統找到

sudo gedit /etc/ld.so.conf.d/opencv.conf

進入後為一個空檔案,在其中輸入 /usr/local/lib,儲存,退出
sudo ldconfig 可以使剛才的配置路徑生效

在這裡插入圖片描述
接下來配置bash(與opencv的庫一同在上個圖)

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

配置完成,如果有錯誤,可以檢視這條部落格(對我的幫助很大)
Ubuntu18.04安裝opencv3.4.3

2.2 opencv對圖片進行特效處理

建立一個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;
}

在這裡插入圖片描述
(隨便找了張jpg圖片,改名為lena.jpg)

g++ test.cpp -o test `pkg-config --cflags --libs opencv` //編譯可執行檔案
       
./test` //執行

最終效果:
在這裡插入圖片描述
原圖效果
在這裡插入圖片描述

2.3opencv呼叫攝像頭

進入 opencv-3.4.3samples/cpp/example_cmake ,開啟命令欄輸入以下命令

cmake .
make
./opencv_example

可以看到攝像頭正常攝像,
在這裡插入圖片描述
在opencv檔案中建立一個 test1.cpp,程式碼如下
在這裡插入圖片描述

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

按照剛才相同的方法執行,可以看到視訊幀執行成功

在這裡插入圖片描述
如果要求開啟你硬碟上一個視訊檔案來播放,第7行該怎麼修改呢,首先,讓我們先看一下imread,imshow,waitkey的構成與作用

#include <opencv2/opencv.hpp>//opencv的標頭檔案
 
using namespace cv;
int main()
{
	Mat img = imread("C:/daima practice/opencv/mat3/mat3/image4.jpg",1);
	/*註釋
	Mat可以理解為一個儲存資料的容器,定義了一個img物件來存圖片的資料。
	imread引數1:引號裡面的為圖片路徑,直接在電腦路徑複製。這裡注意複製出來後是右斜槓"\",我們程式要左斜槓。
	imread引數2:如果寫為1最後輸出就顯示原圖,如果寫為0,最後輸出就顯示灰度圖。
	*/
 
	imshow("顯示灰度圖",img);
	/*
	引數1:顯示圖片的視窗名稱。
	引數2:儲存圖片資料的物件。
	*/
	waitKey(0);
	/*等待按下函式:引數如果寫負數或者0。當顯示圖片後,按下任意鍵後程式退出。如果引數寫為3000就是3秒後程式自動退出。
	*/
	return 0;
}

聯絡以上,從而視訊就很好達到

int main()
{
VideoCapture capture("1.avi");// VideoCapture為新類,捕獲視訊並顯示出來
while (1)
{
Mat frame;
capture >> frame;
imshow("讀取視訊",frame);
waitKey(30);
}
return 0;
}

所以第7行可以改成
VideoCapture capture(“1.mp4”); //也可以為avi字尾

Mat為C++中一個多維陣列,inmread控制著圖片的輸入,而imshow控制著圖片的輸出,waitkey顧名思義,控制著imshow展示的時間,如果沒有watkey,imshow就會一閃而過,看不清任何東西

觀察了參考程式碼2,其中鍵盤也控制著輸入

#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
	//開啟電腦攝像頭
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
		cout << "error" << endl;
		waitKey(0);
		return 0;
	}

	//獲得cap的解析度
	int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Size videoSize(w, h);
	VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
	
	Mat frame;
	int key;//記錄鍵盤按鍵
	char startOrStop = 1;//0  開始錄製視訊; 1 結束錄製視訊
	char flag = 0;//正在錄製標誌 0-不在錄製; 1-正在錄製

	while (1)
	{
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格開始錄製、暫停錄製   可以來回切換
		{
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整個程式,儲存視訊檔案到磁碟
		{
			break;
		}

		if (startOrStop == 0 && flag==1)
		{
			writer << frame;
			cout << "recording" << endl;
		}
		else if (startOrStop == 1)
		{
			flag = 0;
			cout << "end recording" << endl;
			
		}
		imshow("picture", frame);
	}
	cap.release();
	writer.release();
	destroyAllWindows();
        return 0;
}

用opencv編譯上述程式碼
在這裡插入圖片描述
使用空格能改變視訊錄製狀態,ESC鍵能夠返回,比ctrl+c方便了不少
在這裡插入圖片描述
至此,ubuntu下的opencv安裝與使用就到這裡了,接下來是樹莓派上opencv的開發與使用

3 windows安裝opencv3.4.1

首先,點開電腦的高階設定,設定環境變數中的path,在末尾加上

E:\steam1\wuhu\opencv\build\x64\vc15\bin
注:上方為自己opencv的bin檔案的位置
在這裡插入圖片描述
然後開啟VS2017,建立一個空專案
在這裡插入圖片描述
然後在空專案中建立一個test.cpp,用來顯示一張照片

#include <opencv.hpp>
using namespace cv;
int main()
{
		Mat srcImage;
		srcImage = imread("D://lww.jpg"); //放在D盤的一張小照片
		imshow("影像", srcImage);
		waitKey();
	return 0;
}

在屬性中找到VC++目錄,修改包含目錄
在這裡插入圖片描述
庫目錄
在這裡插入圖片描述
連結器->輸入->新增依賴庫
在這裡插入圖片描述
除錯剛才的test1函式,圖片出現
在這裡插入圖片描述

下為一個開啟特效函式,能讓開啟的圖片變暗(借鑑的別人的函式)

#include <highgui.hpp>
#include <opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
	CvPoint center;
	double scale = -3;
	IplImage* image = cvLoadImage("D://Code//testResourses//testimg.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;
}

在這裡插入圖片描述

4.樹莓派使用opencv

樹莓派上opencv安裝與ubuntu安裝相差無二,且室友已在旁邊配置好了,所以就直接使用了。
在這裡插入圖片描述

5.總結

本次實驗,我在windows,ubuntu,樹莓派三個地方都使用了opencv,也看到了ubuntu中opencv如何呼叫的攝像頭、三個系統中如何呼叫的圖片,總的來說收穫很大,期待下一次學習!

相關文章