關於在windows,ubuntu,樹莓派上安裝使用opencv
關於在windows,ubuntu,樹莓派上安裝使用opencv
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如何呼叫的攝像頭、三個系統中如何呼叫的圖片,總的來說收穫很大,期待下一次學習!
相關文章
- 在樹莓派上安裝 Ubuntu MATE樹莓派Ubuntu
- 在樹莓派上安裝c++版本的opencv並執行樹莓派C++OpenCV
- 在樹莓派上安裝mysql/MariaDB樹莓派MySql
- 樹莓派上安裝php樹莓派PHP
- 在樹莓派上編譯安裝golang環境樹莓派編譯Golang
- 在樹莓派上安裝go環境很簡單樹莓派Go
- 樹莓派opencv的安裝樹莓派OpenCV
- 樹莓派上安裝USB網路攝像頭樹莓派
- 樹莓派裝opencv樹莓派OpenCV
- 樹莓派使用入門:在樹莓派上使用 Mathematica 進行高階數學運算樹莓派
- 在樹莓派上執行 DOS 系統樹莓派
- 樹莓派上安裝2.8寸TFT觸控式螢幕樹莓派
- 在樹莓派上部署yolo模型推理並使用onnx加速樹莓派YOLO模型
- 在樹莓派上搭建智慧家居閘道器樹莓派
- OpenYurt 入門 - 在樹莓派上玩轉 OpenYurt樹莓派
- 樹莓派上使用Slowloris進行DDoS攻擊樹莓派
- 樹莓派上使用螞蟻礦機挖礦樹莓派
- 樹莓派上配置伺服器樹莓派伺服器
- 樹莓派4b安裝OpenCV 新手推薦樹莓派OpenCV
- 樹莓派安裝 ubuntu 20.04 LTS 碰壁指南樹莓派Ubuntu
- [譯] 如何輕鬆地在樹莓派上使用深度學習檢測物件樹莓派深度學習物件
- 樹莓派裝Ubuntu16.04樹莓派Ubuntu
- 在樹莓派上設定家庭網路的家長控制功能樹莓派
- 在樹莓派上開發SpringBoot 之使用VSCode遠端開發樹莓派Spring BootVSCode
- 如何在樹莓派上部署Kubernetes樹莓派
- 使用 Ansible 在樹莓派上構建一個基於 Linux 的高效能運算系統樹莓派Linux
- 樹莓派上使用DHCPig進行DHCP池耗盡攻擊樹莓派
- 樹莓派編譯安裝opencv3 (2019.1.6更新)樹莓派編譯OpenCV
- 樹莓派安裝nodejs樹莓派NodeJS
- 樹莓派系統安裝教程樹莓派
- 如何在樹莓派上執行雷神之錘III樹莓派
- 使用樹莓派搭建Ubuntu伺服器樹莓派Ubuntu伺服器
- 樹莓派上使用Pi-FM-RDS工具打造FM調頻電臺樹莓派
- 亞馬遜詳解如何使用MXNet在樹莓派上搭建實時目標識別系統亞馬遜樹莓派
- Ubuntu 14.04 下安裝 OpenCVUbuntuOpenCV
- 樹莓派上使用KickThemOut對區域網內的裝置進行ARP欺騙樹莓派
- 樹莓派安裝QT5樹莓派QT
- 樹莓派安裝 vscode樹莓派VSCode