2016年12月15日 星期四

opencv c++ 錄製Video

OpenCV用VideoWriter類別來製作影像檔,一般的影像檔除了影像壓縮與編碼規格之外,還有聲音與字幕,但OpenCV開發時為求簡化,所以並沒有納入音軌與字幕,只單純處理影像,現在所有影像編碼都有獨一的短名,像XVID、CIVX和H264等,在使用VideoWriter時,我們可指定編碼方式。
VideoWriter建構式

VideoWriter::VideoWriter()


VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)


  • filename:輸出影像檔的檔名。
  • fourcc:編碼方式,舉例來說CV_FOURCC(‘P’,’I’,’M’,’1′)是MPEG-1,CV_FOURCC(‘M’,’J’,’P’,’G’)是motion-jpeg。
  • fps:更新頻率。
  • frameSize:影像檔的影像尺寸。
  • isColor:是否為彩色影像。

VideoWriter初始化


bool:VideoWriter::open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)

初始化參數和建構式相同,功用也一樣,我們可以建構式就指定影像檔各設定,也可以先用VideoWriter()這個建構式,接著用open()設定影像檔。
bool VideoWriter::isOpened()

檢查是否初始化成功,如果成功返回true,否則返回false。
VideoWriter寫入影像

VideoWriter& VideoWriter::operator<<(const Mat& image)

void VideoWriter::write(const Mat& image)

透過這個函式,將image寫入要輸出的影片檔。

以下程式碼開啟攝影機鏡頭讀取影像,並將這些及時影像存成avi檔:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
Mat frame;

while (capture.isOpened())
{
capture >> frame;
writer << frame;
imshow("video", frame);
if (cvWaitKey(20) == 27){
break;
}
}

}

Reference:

2016年12月14日 星期三

VNC 和 Raspberry Pi 連線

VNC 是一種使用 RFB 協定的螢幕畫面分享及遠端操作軟體。由於 VNC 與作業系統無關,因此可跨平台使用。如果我們需要和 Pi 做有圖形介面的連線,VNC 是首選。

方法一:

這裡簡介如何在 Pi 上安裝設定 VNC 伺服器,並透過個人電腦以 VNC 用戶端連線到 Pi。

1. 在 Pi 上安裝 VNC 伺服器。

pi@raspberrypi:~$ sudo apt-get install tightvncserver

2. 在個人電腦安裝 VNC 用戶端。

cheng@cheng-System-Product-Name:~$ sudo apt-get install vncviewer gtkvncviewer

3. 在 Pi 上啟動 vncserver。

pi@raspberrypi:~$ vncserver


如果是第一次執行 vncserver 時會問幾個問題,包括登入的密碼和可供其他人流覽的 read-only 密碼,而 read-only 密碼可以不設定。登入的密碼會加密後存在 ~/.vnc/passwd 檔案裡。


You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
之後我們就可以透過 vncviewer 或是 gtkvncviewer 之類的軟體和 Pi 連線了。假設 Pi 的 IP 為 192.168.1.2。


cheng@cheng-System-Product-Name:~$ vncviewer 192.168.1.2:5901

方法二:





Reference:

opencv c++ open raspberry pi camera


/**
* 2016/12/04
* project name: 05_openc_camera.cpp
* Author : Oopscheng
*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main(){

VideoCapture cap(0);

if(!cap.isOpened()){
cout<<"Cannot open the web cam\n";
return -1;
}
//cap.set(CV_CAP_PROP_FRAME_HEIGHT,320);//window height
//cap.set(CV_CAP_PROP_FRAME_WIDTH,240);//window witdh

Mat frame;

while(1){

bool bSuccess = cap.read(frame);
imshow("frame", frame);
if(waitKey(30) >= 0)
break;
}
system("PAUSE");
return 0;
}

2016年12月13日 星期二

Makefile教學

有於編譯opencv c++的檔案指令太長了記不起來=口=
只好來使用Makefile


1.什麼是Makefile?

很多Winodws的程序員都不知道這個東西,因為那些 Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional的程序員,makefile還是要懂。這就好像現在有這麼多的HTML的編輯器,但如果你想成為一個專業人士,你還是要了解HTML的標識的含義。特別在Unix下的軟體編譯,你就不能不自己寫makefile 了,會不會寫makefile,從一個側面說明了一個人是否具備完成大型專案的能力。

因為,makefile關係到了整個專案的編譯規則。一個專案中的原始碼檔案不計數,其按類型、功能、分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行作業系統的命令。


2.關於程序的編譯和連結

於程序編譯的一些規範和方法,一般來說,無論是C、C++,首先要把原始碼檔案編譯成中間程式碼檔案,在Windows下也就是 .obj 檔案,UNIX下是 .o 檔案,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行檔案,這個動作叫作連結(link)

編譯時,編譯器需要的是語法的正確,函數與變量的宣告的正確。對於後者,通常是你需要告訴編譯器頭檔案的所在位置(頭檔案中應該只是宣告,而定義應該放在C/C++檔案中),只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始碼檔案都應該對應於一個中間目標檔案(O檔案或是OBJ檔案)。

連結時,主要是連結函數和全域變量,所以,我們可以使用這些中間目標檔案(O檔案或是OBJ檔案)來連結我們的應用程序。連結器並不管函數所在的原始碼檔案,只管函數的中間目標檔案(Object File),在大多數時候,由於原始碼檔案太多,編譯生成的中間目標檔案太多,而在連結時需要明顯地指出中間目標檔案名,這對於編譯很不方便,所以,我們要給中間目標檔案整理成套件,在Windows下這種套件叫「函式庫檔案」(Library File),也就是 .lib 檔案,在UNIX下,是Archive File,也就是 .a 檔案。

總結一下,原始碼檔案首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時,編譯器只檢測程序語法,和函數、變量是否被宣告。如果函數未被宣告,編譯器會給出一個警告,但可以生成Object File。而在連結程式時,連結器會在所有的Object File中找尋函數的實現,如果找不到,那到就會報連結錯誤碼(Linker Error),在VC下,這種錯誤一般是:Link 2001錯誤,意思說是說,連結器未能找到函數的實現。你需要指定函數的Object File.

3.Makefile 介紹

make命令執行時,需要一個 Makefile 檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。

3.1Makefile的規則


在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。



    target ... : prerequisites ...

            command
            ...
            ...

    target也就是一個目標檔案,可以是Object File,也可以是執行檔案。還可以是一個標籤(Label),對於標籤這種特性,在後續的「偽目標」章節中會有敘述。

    prerequisites就是,要生成那個target所需要的檔案或是目標。

    command也就是make需要執行的命令。(任意的Shell命令)

這是一個檔案的依賴關係,也就是說,target這一個或多個的目標檔案依賴於 prerequisites中的檔案,其生成規則定義在command中。說白一點就是說,prerequisites中如果有一個以上的檔案比 target檔案要新的話,command所定義的命令就會被執行。這就是Makefile的規則。也就是Makefile中最核心的內容。

來個簡單的範例吧

04_video_to_frame: 04_video_to_frame.cpp
g++ 04_video_to_frame.cpp -o 04_video_to_frame `pkg-config --cflags --libs opencv`


Makefile還很博大精深有興趣的大大可以去下面連結,寫的很好

Reference:

http://blog.xuite.net/jack_sb/2312/16268132-Makefile

Opencv c++ read video frame imwrite images

這篇將讀取.mp4檔,將每個frame轉灰階並儲存為圖片。



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <cv.h>
#include <string>
#include <sstream>
using namespace cv;
using namespace std;
int c=0;
string int2str(int &);

int main(int argc, char **argv){
string s;

VideoCapture cap("test.mp4"); // open the video file for reading

if ( !cap.isOpened() ) // if not success, exit program
{
cout << "Cannot open the video file" << endl;
return -1;
}

//cap.set(CV_CAP_PROP_POS_MSEC, 300); //start the video at 300ms

double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video

cout << "Frame per seconds : " << fps << endl;

namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
namedWindow("MyVideo_gray",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
while(1)
{
Mat frame;
Mat Gray_frame;
bool bSuccess = cap.read(frame); // read a new frame from video

if (!bSuccess) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}
cvtColor(frame, Gray_frame, CV_BGR2GRAY);
s = int2str(c);
//cout<<("%d\n",frame )<<endl;
c++;
imshow("MyVideo", frame); //show the frame in "MyVideo" window
imshow("MyVideo_gray", Gray_frame);
imwrite( "ig"+s+".jpg", Gray_frame );
if(waitKey(30) == 27) //wait for 'esc' key press for 30 ms. If 'esc' key is pressed, break loop
{
cout << "esc key is pressed by user" << endl;
break;
}
}

return 0;

}

//int to string function
string int2str(int &i) {
string s;
stringstream ss(s);
ss << i;
return ss.str();
}
結果圖:

Opencv c++ GUI Trackbar

Trackbar來做影像黑白圖(二值圖)的實作,在這裡,全彩圖要轉成黑白圖就必須要先轉成灰階圖,變成灰階圖之後就必須要設定一個門檻值才能轉成黑白圖,這邊則是用Trackbar來做動態門檻值的校調.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cstdio>
#include <cv.h>
using namespace cv;
using namespace std;

void * WindowHandle1;

char FileName[]="rain.jpg";
char TrackbarName[]="Threshold";

int TrackbarInitValue=180;
int TrackbarStopValue=255;

IplImage *Image1;
IplImage *Image2;
CvSize Image2Size;

int main()
{
char FileName[]="rain.jpg";
IplImage *Image;
Image = cvLoadImage(FileName,CV_LOAD_IMAGE_GRAYSCALE); // 讀取影像,轉換為灰階
cvThreshold(Image,Image,128,255,CV_THRESH_BINARY); // 將灰階值在128以上設為255,以下則設為0
cvShowImage("Image",Image);
cvWaitKey(0);
cvDestroyWindow("Image");
cvReleaseImage(&Image);
return 0;

}


跟前一篇程式碼比起來,這邊多創造了IplImage資料結構的Image2及一個CvSize資料結構的Image2Size,然後初始化Image2Size的大小為Image1的寬跟高,再用cvCreateImage()初始化Image2的圖形空間,這邊給Image2,8位元1個通道非負整數空間,也就是開了一個非負整數0~255的二維陣列,設立一個新的視窗,加上了cvCreateTrackbar()的函式,而使用cvCreateTrackbar()必須要給予Trackbar一個事件,事件的命名可以自由的取名字,這裡給它的事件名稱是void onTrackbar(int postion),預設Trackbar的位置在180,最大拉軸長度是255,用cvGetTrackbarPos()查看拉軸位置,再用cvSetTrackbarPos()重新定位拉軸位置為177,接著,在onTrackbar()中放入了cvThreshold()演算法函式,再用cvSohwImage()顯示二值化的結果.要注意的是,設定事件名稱的時候最好也符合命名規則,增加可讀性,在這邊OpenCV可寫的事件比一般GUI介面還少很多,如果有瞭解過GUI的事件(Event),大概就曉得為啥要這樣設計.
接著逐一介紹各副程式的功能,從"highgui.h"的開始:

cvCreateTrackbar()
創立一個Trackbar在目標視窗上,起始值從0開始,而Trackbar指標開始的位置跟Trackbar最大值要自己設定,再給他一個可控制的事件名稱,此Trackbar事件可自由命名,但是務必要讓他輸入一個int型別的變數如:void xxx(int position).
cvCreateTrackbar("Trackbar名稱","目標視窗名稱",指標開始數值,Trackbar最大值,Trackbar事件副程式名稱);

cvGetTrackbarPos()
檢視Trackbar的位置,需要給它Trackbar的名稱,目標視窗名稱.
int cvGetTrackbarPos("Trackbar名稱","目標視窗名稱");

cvSetTrackbarPos()
重新設定Trackbar的位置,需要給它Trackbar的名稱,目標視窗名稱.
cvGetTrackbarPos("Trackbar名稱","目標視窗名稱",新的拉軸位置數據);

接下來都非highgui.h的函式

cvSize()
初始化CvSize資料結構,放置長跟寬的整數值
CvSize cvSize(寬的數值,高的數值);

cvCreateImage()
初始化IplImage資料結構,創造一個空白的圖片基本的格式,格式內容可參考命名規則,再給他通道數(二維陣列的數目).
cvCreateImage(CvSize資料結構,IPL_DEPTH_系列參數,通道數);

onTrackbar()
自行定義名稱,主要是接收拉軸移動後的數值,此數值做為二值化的門檻值,通常拉軸移動的數值都是做為各個演算法的門檻值之用.
void onTrackbar(拉軸移動整數值);

cvThreshold()
此為演算法功能之ㄧ,跟門檻值相關的演算法蒐集的副程式,第一個引數為輸入圖,第二個引數為計算結果的圖,再來是門檻最大值,二值化門檻值參數.
cvThreshold(原始圖形IplImage資料結構,計算後結果IplImage資料結構,門檻值,最大門檻值數值,CV_THRESH_BINARY);

 Reference:


Opencv c++ GUI 開啟圖片

在這裡,要放的焦點就是"highgui.h"這個函式庫啦,"highgui.h"提供了許多基本的功能,實際上用起來也不麻煩,主要是簡單好用吧,但功能性沒有很強大,不比Visual C++的mfc及C++ Builder的vcl好用的多,如果真的需要強大的GUI功能,則就把OpenCV引入Visual C++及C++ Builder的函式庫吧.這邊所提供,OpenCV的GUI介面功能分為圖片(Image),視訊(Capture),視窗(Form),拉軸(TrackBar),滑鼠,鍵盤,AVI檔案的播放,有點少,不過夠用。


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

void * WindowHandle1;
char FileName[]="rain.jpg";
IplImage *Image1;

int main()
{
Image1 = cvLoadImage(FileName,CV_LOAD_IMAGE_UNCHANGED);
cvNamedWindow("Show Image",CV_WINDOW_AUTOSIZE);//set (windows name , parameter)
cvMoveWindow("Show Image",0,0);//windows display position (x,y)
WindowHandle1=cvGetWindowHandle("Show Image");
cout<<("The Window Handle is : %d\n",WindowHandle1)<<endl;
cout<<("The Window Name is : %s\n",cvGetWindowName(WindowHandle1))<<endl;
cvShowImage("Show Image",Image1);
cvWaitKey(0);
cvDestroyWindow("Show Image");
cvReleaseImage(&Image1);
}


這裡用了許多"highgui.h"現有的程式庫,如
cvLoadImage()
cvNamedWindow()
cvMoveWindow()
cvResizeWindow()
cvGetWindowHandle()
cvGetWindowName()
cvShowImage()
cvWaitKey()
cvDestroyWindow()
cvReleaseImage()
也可以說,除了IplImage及printf()其他都是"highgui.h"內建的函式庫,程式碼的一開始,就用(void *)型別建立了一個Window Handle的視窗ID變數,接著就對視窗作位移及縮放,再來拿到widow handle ID,再用handle ID去搜尋視窗字串名稱,顯視圖片,執行鍵盤事件,清空記憶體,這邊搜尋Window Handle的好處是,可以對視窗做一些基本的溝通。

cvLoadImage()
顧名思義,就是載入圖片的意思,它的使用方法為
IplImage* cvLoadImage("檔案名稱",參數);
參數的部份可以參考命名規則的說明,回傳的訊息是IplImage資料結構,它的參數分類有

#define CV_LOAD_IMAGE_UNCHANGED -1        原圖影像
#define CV_LOAD_IMAGE_GRAYSCALE 0             灰階
#define CV_LOAD_IMAGE_COLOR 1                    彩色
#define CV_LOAD_IMAGE_ANYDEPTH 2           任何彩度
#define CV_LOAD_IMAGE_ANYCOLOR 4           任何彩色

原始影像如果是灰階圖的話會因為檔案格式的關係而不可能變成彩色,但彩色圖片卻可以任意變成灰階,參數的部份可以用大寫英文或數字來替代.

cvNamedWindow()
這個副程式,是給視窗化介面命名的副程式,用法如下
cvNamedWindow("視窗名稱",參數);
而它的參數實質上只有一個

#define CV_WINDOW_AUTOSIZE 1            自動調整圖形大小

AUTOSIZE可以讓圖片便成原圖大小,也就是圖形維度不做調整,但是圖片太大很容易造成困擾,就如RainMan,維度為1200*1600,會造成圖片佔據了整個螢幕的版面.如果要微調就要用到cvResizeWindow()這個函式,但是,cvNamedWindow()不能設成1(CV_WINDOW_AUTOSIZE),務必將參數設為0或其他非1的數字.

cvMoveWindow()
移動GUI視窗到"螢幕座標"上的位置.當我們移動滑鼠時,實際上是在Windows作業系統底下的座標軸在變換,這個函式可以將做出來的GUI視窗以右上角為準移動到指定螢幕座標的地方.使用方法:
cvMoveWindow("視窗名稱",螢幕X軸數字,螢幕Y軸數字);

cvResizeWindow()
將視窗作縮放的動作,圖片將會等比例的變換,但cvNamedWindow()參數必須設為非1.
cvResizeWindow("視窗名稱",縮放寬度,縮放高度);

cvGetWindowHandle()
一個視窗所產生的ID,當我們創立一個視窗的時候,作業系統個隨機給予一個視窗ID,每次重新打開這個ID都會不一樣,可以把它視為純數字,不過,通常都是用(void *)資料型態來設立,這邊就是用視窗名稱來找視窗ID
cvGetWindowHandle("視窗名稱");

cvGetWindowName()
用ID來反查視窗名稱.
cvGetWindowName(視窗ID);

cvShowImage()
顯視圖片.
cvShowImage("視窗名稱",IplImage資料結構或CvArr資料結構);

cvWaitKey()
鍵盤事件,秀出圖形必備,這邊如果有開啟cvShowImage()的話,就必須要用到cvWaitKey(),而不能用"stdlib.h"裡的system("pause")取代,cvWaitKey()是專門在在OpenCV專用的GUI介面底下等待鍵盤命令的,而不是在黑白環境下的命令提示字元,鍵盤事件有兩種,阻斷式(block)的跟非阻斷式(unblock)的可以在作業系統原理的相關書籍讀到,阻斷式的就是cvWaitKey(0),它會一直等待到鍵盤事件發生為止,另一種就是在裡面輸入大於零的數字cvWaitKey(10),它將會等到10毫秒後自動輸出-1,代表10毫秒內沒接收到鍵盤敲擊事件,因此,典型的副程式表示法為
cvWaitKey(數字);

cvDestroyWindow()
清除視窗記憶體
cvDestroyWindow("視窗名稱')

cvReleaseImage()
清除IplImage圖形資料結構記憶體
cvReleaseImage(IplImage資料結構名稱)

Reference:

2016年12月12日 星期一

Opencv 印出圖片像素

訪問每個像素,還不知道原理。
了解後再補上

code

xx.cpp 



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, char** argv){
int c = 0;
int width=src->width;//图片宽度
int height = src->height;//图片高度

for (size_t row=0;row<height;row++){
uchar* ptr = (uchar*)src->imageData+row*src->width;//获得灰度值数据指针
for (size_t cols=0;cols<width;cols++){
int intensity=ptr[cols];
cout<<" "<<intensity<<" ";
c++;
}
cout<<"\n"<<endl;
}
cout<<("c = %d",c)<<endl;
cvSave("1R.jpg",src); //使用cvSave將數值轉換,使用記事本打開可直接看pixel的灰階值(0~255)
return 0;
}

編譯
 g++ 01_inage_to_gray.cpp -o  01_inage_to_gray `pkg-config --cflags --libs opencv`

Reference:

https://zhidao.baidu.com/question/412847971.html

使用Ubuntu遠端連線撰寫程式

再PI上撰寫程式通常使用vim,nano 但對我來說太難用了。當然會比較好拉XD

Install sublime SFTP

鍵盤按鍵按下 ctrl+shift+p

Package Control: Install Package
Search SFTP

 安裝完成後

File->SFTP/FTP->setup server

要設定一下 sftp-config.json


{
// sftp, ftp or ftps
"type": "sftp",

"save_before_upload": true,
"upload_on_save": true,

"host": "192.168.0.xxx",
"user": "pi",
"password": "raspberry",

"remote_path": "/home/pi",
}

2016年12月9日 星期五

Install opencv in Raspberry Pi3

如果之前有安裝過opencv先卸載,在這種情況下,它是作為使用包管理除去的OpenCV的包一樣簡單。例如,在基於Ubuntu Linux系統中你可以寫在你喜歡的終端下面的命令

sudo apt-get remove libopencv
sudo apt-get remove opencv
如果您已經從源代碼安裝(使用make / make安裝):
在這種情況下,make命令應該已經為您創建一個卸載配置文件。所以要去除OpenCV的,去你已經編譯OpenCV的文件夾(你曾呼籲使這個地方/ make install的),並執行以下命令:

sudo make uninstall
注意: 如果你不記得怎麼有你安裝了OpenCV的,或沒有上述方法為你工作,你可以用下面的命令來刪除具有是與OpenCV的任何文件。請注意,刪除文件可能是危險所以這樣做對你自己的風險!我不承擔責任!🙂
sudo find / -name "*opencv*" -exec rm -i {} \;
sudo ldconfig && sudo ldconfig -vp


先檢查是否有足夠的空間
df -h

更新系統
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
sudo reboot
安裝開發工具
sudo apt-get install build-essential cmake cmake-curses-gui pkg-config
安裝需要的函式庫
sudo apt-get install \
libjpeg-dev \
libtiff5-dev \
libjasper-dev \
libpng12-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libeigen3-dev \
libxvidcore-dev \
libx264-dev \
libgtk2.0-dev

  圖檔格式
  libjpeg-dev \
  libtiff5-dev \
  libjasper-dev \
  libpng12-dev \ 


音訊、視訊的編碼、錄製、串流
  libjpeg-dev \
  libtiff5-dev \
  libjasper-dev \
  libpng12-dev \

安裝GTK
libgtk2.0-dev


Video4Linux


Python通過picamera模塊管理Raspberry的攝像頭,你也可以在OpenCV中使用這個module,但你必須抓取圖像到numpy.array然後將array映射到OpenCV Mat。

要使用標準抓取循環cv2.VideoCapture(0),raspicam需要Video4Linux驅動程序


  1. 檢查先決條件
    1. Enable the camera
    2. Set large memory for gpu_mem (In Advance Options > Memmory Split set 128 min)
    3. sudo raspi-config


  2. 安裝V4L函式庫
  3. sudo apt-get -y install libv4l-dev v4l-utils
  4. 啟動內核(開機一定要加此行)可以自行加再開機腳本
  5. sudo modprobe bcm2835-v4l2
  6. 測試module
  7. v4l2-ctl --list-devices
成功的話應該有以下訊息

其他函式庫
sudo apt-get install libatlas-base-dev gfortran
安裝python Install python-dev & numpy
sudo apt-get install python2.7-dev python2-numpy
sudo apt-get install python3-dev python3-numpy
 安裝OpenCV優化的開發工具
sudo apt-get install libatlas-base-dev gfortran
下載OpenCV的原始檔,這次安裝的是 3.1.0
 cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip
下載 opencv_contrib 函式庫
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib.zip
安裝 Python 的套件管理程式 pip:
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
安裝 numpy Python 陣列運算的數學函式函式庫
pip install numpy
再解壓縮目錄裡新建build資料夾為工作目錄
cd opencv-3.1.0/

mkdir build

cd build
先執行cmake產生建置需要的設定檔
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_PERF_TESTS=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.1.0/modules \
-D ENABLE_NEON=ON \
-D WITH_LIBV4L=ON \
../

成功的話可以看見以下訊息:
如果你喜歡我們的默認配置,你可以跳過下一段
使用cmake gui查看/修改配置 您可以從上面更改一些命令行開關,或者可以使用ccmake配置所有可用選項



當你完成後按c鍵進行配置。如果沒有錯誤發生,按q生成makefile

建立 Opencv
make -j4
100%可以看到


Install Opencv
sudo make install 

執行指令更新程式庫:
 
sudo ldconfig 

檢查OpenCV的版本:
 
pkg-config --modversion opencv 

測試一下吧XD

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main(int argc, char **argv){
Mat image = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
Mat imagegray = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE );//always convert image to the grayscale
namedWindow("image",CV_WINDOW_AUTOSIZE);//AUTOSIZE
namedWindow("imagegray",CV_WINDOW_NORMAL);//Custom sizes
imshow("image",image);
imshow("imagegray",imagegray);
resizeWindow("imagegray",320,240);
waitKey(0);
return 0;

}
編譯指令:
g++ test.cpp -o test `pkg-config --cflags --libs opencv`

Referencn:

http://pklab.net/?id=392&lang=EN
http://lilgcheng.blogspot.tw/
http://storychen.blogspot.tw/2016/06/raspberry-pi-3-opencv.html
http://embedonix.com/articles/image-processing/installing-opencv-3-1-0-on-ubuntu/

2016年2月28日 星期日

高斯模糊與二值化


  • imgproc
    • 圖像處理模塊,其包括線性和非線性圖像濾波,幾何圖像變換(調整大小,仿射和立體翹曲,通用基於表的重新映射),顏色空間轉換,直方圖等。




高斯模糊
#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;

int main(){
 //抓取攝影機
 VideoCapture cap(0);
 //嘗試開啟攝影機
 if(!cap.isOpened()){
  cout<<"Cannot open the web cam\n";
  return -1;
 }
 cap.set(CV_CAP_PROP_FRAME_HEIGHT,320);//window height
 cap.set(CV_CAP_PROP_FRAME_WIDTH,240);//window  witdh

 //用矩陣紀錄抓取的每張frame
 Mat frame;

 while(1){
  //把取得的影像放置到矩陣中
  bool bSuccess = cap.read(frame);

  Mat Blur;
  GaussianBlur(frame, Blur, Size(7,7),1.5,1.5);
  imshow("frame", frame);
  imshow("Blur", Blur);
  if(waitKey(30) >= 0) break;
 }
 system("PAUSE");
 return 0;
}


二值化
#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;

int main(){
 //抓取攝影機
 VideoCapture cap(0);
 //嘗試開啟攝影機
 if(!cap.isOpened()){
  cout<<"Cannot open the web cam\n";
  return -1;
 }
 cap.set(CV_CAP_PROP_FRAME_HEIGHT,320);//window height
 cap.set(CV_CAP_PROP_FRAME_WIDTH,240);//window  witdh

 //用矩陣紀錄抓取的每張frame
 Mat frame;

 while(1){
  //把取得的影像放置到矩陣中
  bool bSuccess = cap.read(frame);

  Mat Blur;
  GaussianBlur(frame, Blur, Size(9,9),2,2);

  Mat Gray;
  // Convert it to gray
  cvtColor( Blur, Gray, CV_BGR2GRAY );
  
  imshow("frame", frame);
  imshow("Blur", Blur);
  imshow("Gray", Gray);
  if(waitKey(30) >= 0) break;
 }
 system("PAUSE");
 return 0;
}

2016年2月17日 星期三

Opencv C install

自行編譯OPENCV

先跟新套件
$ sudo apt-get update
$ sudo apt-get dist-upgrade -y


若是直接安裝現成的套件,指令如下:
$ sudo apt-get install libopencv-dev

建制與編譯所需工具:
$ sudo apt-get install build-essential gcc cmake pkg-config

python相關:
$ sudo apt-get install python python-dev python-numpy 

圖形視窗程式庫:
$ sudo apt-get install libgtk2.0-dev

音訊、視訊的編譯碼、錄製、串流:
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev

圖檔格式
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libjasper-dev

IEEE 1394相機介面:
$ sudo apt-get install libdc1394-22-dev

TBB
$ sudo apt-get install libtbb2 libtbb-dev

大都沒問題,但是Raspbian沒有libtbb2和libtbb-dev這兩個套件,於是也必須自己編譯;照理說這是選用性功能,可有可無,但TBB是C/C++平行處理程式庫,有了它,OpenCV的速度會較快。
到TBB網站,查詢原始碼檔案的網址,下載並解壓縮,得到含原始碼檔案的目錄,切換進去:
$ wget https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20151115oss_src.tgz
$ tar zxvf tbb44_20151115oss_src.tgz
$ cd tbb44_20151115oss

開始建制,根據這篇,加上參數
$ make tbb CXXFLAGS="-DTBB_USE_GCC_BUILTINS=1 -D__TBB_64BIT_ATOMICS=0"

然後進入子目錄build,裡頭會有兩個目錄存放建置結果,其一以debug結尾、另一個以release結尾,切換到release那一個:
$ cd build
$ cd linux_armv7_gcc_cc4.9.2_libc2.19_kernel4.1.13_release

執行tbbvars.sh這支腳本程式檔,它會設定許多環境變數,之後的OpenCV才知道TBB在哪:
$ source tbbvars.sh

搞定TBB後,接著是OpenCV 安裝
$unzip opencv-2.4.9.zip
$ cd opencv
$mkdir build
$cd build

先執行cmake產生建置需要的設定檔:
$ cmake -DWITH_TBB:BOOL=TRUE -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

其中「-DWITH_TBB:BOOL=TRUE「代表我們想要使用TBB,「-D CMAKE_INSTALL_PREFIX=/usr/local」代表之後要安裝的路徑,最後的「..」代表原始碼所在路徑。
然後開始建制:
$make -j4

然後安裝:
$ sudo make install

執行指令更新程式庫:
$ sudo ldconfig

檢查OpenCV的版本:
$ pkg-config --modversion opencv

然後是是撰寫C++程式,顯示一張圖檔。新增檔案test.cpp,準備一張圖檔lena.jpg,程式內容如下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>


using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
 Mat image = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
 Mat imagegray = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE );//always convert image to the grayscale

 namedWindow("image",CV_WINDOW_AUTOSIZE);//AUTOSIZE 
 namedWindow("imagegray",CV_WINDOW_NORMAL);//Custom sizes
 imshow("image",image);
 imshow("imagegray",imagegray);
 resizeWindow("imagegray",320,240);
 waitKey(0);
 return 0;
}



編譯
g++ test.cpp -o test `pkg-config --cflags --libs opencv`

成功如下
參考資料
http://yehnan.blogspot.tw/2015/12/raspberry-piraspbianopencv.html
http://blogger.gtwang.org/2015/01/raspberry-pi-install-opencv.html 
http://stackoverflow.com/questions/9094941/compiling-opencv-in-c