顯示具有 OpenCV 標籤的文章。 顯示所有文章
顯示具有 OpenCV 標籤的文章。 顯示所有文章

2018年5月25日 星期五

OpenCV 3.4.1 在 Windows10 上編譯 MinGW 版本

OpenCV 3.4.1 在 Windows10 上編譯 MinGW 版本

首先要先安裝下面兩個軟體
cmake不知道為什麼跑超慢,我自己傳了一份 這裡
cmake 不能用舊版的,OpenCV 會跟著他的版本更新舊版會出奇怪的錯
安裝 cmake 的時候記得選擇安裝到環境變數到使用者
再來我們下載opencv從github上
cd C:\
mkdir opencv341_source
cd opencv341_source
git clone -b 3.4.1 https://github.com/opencv/opencv
git clone -b 3.4.1 https://github.com/opencv/opencv_contrib
再來我們產生編譯檔案
mkdir build
cd build
cmake -G "MinGW Makefiles" -DOPENCV_EXTRA_MODULES_PATH="C:\opencv341_source\opencv_contrib\modules" "C:\opencv341_source\opencv"
產生好之後編譯他
CPU不要開多,記憶體不夠多會爆ram,下場就是開始吃虛擬記憶體然後硬碟100%,硬碟一旦100%系統就會停機,超級頓超級卡;太超過還會出動清潔隊掃掉不重要的程式…
i7 4770K + 16G + SSD 大概跑10分鐘,舊電腦跑過幾小時的正常不要怕XDD
# j 是選擇幾顆核心
mingw32-make -j5

# 依據你裝的 MingGW 不同也可能是這樣(兩個擇一就好)
# make -j5
這邊我不知道為什麼出問題了,出問題的時候要用單顆核心編譯,才不會看不到訊息
mingw32-make
出問題的訊息是
modules\dnn\CMakeFiles\opencv_dnn.dir\build.make:1015: recipe for target ‘modules/dnn/CMakeFiles/opencv_dnn.dir/layers/layers_common.avx512_skx.cpp.obj’ failed
嘗試爬文找到這個
看起來是某個模組的支援性已經放棄MinGW32了,於是根據提示重下指令
處理方式就是把那個模組拿掉不要用了,因為我也沒用到所以很乾脆的就放了
cmake -G "MinGW Makefiles" -DBUILD_opencv_dnn=OFF -DOPENCV_EXTRA_MODULES_PATH="C:\opencv341_source\opencv_contrib\modules" "C:\opencv341_source\opencv"
mingw32-make -j5
這次很順利的結束了編譯成功,感動QuQ
最後一步安裝,不過在Windows下應該只是把編譯好的檔案複製到 install 這個資料夾而已,在 linux 底下會複製到系統內,並且幫你安裝環境變數
我們要的檔案都幫我們複製到這裡了

測試執行

萬年測試代碼再拿出來放一次
/**********************************************************
Name :
Date : 2016/05/29
By   : CharlotteHonG
Final: 2018/05/25
**********************************************************/
#include <iostream>
using namespace std;

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

int main(int argc, char const *argv[]) {
    cout << "=!!===test run is ok===!!=" << endl;
    /* 畫布 */
    Mat img(270, 720, CV_8UC3, Scalar(56, 50, 38));
    /* 直線 */
    line(img, Point(20, 40), Point(120, 140), Scalar(255, 0, 0), 3);
    /* 實心方塊 */
    rectangle(img, Point(150, 40), Point(250, 140), Scalar(0, 0, 255), -1);
    /* 實心圓 */
    circle(img, Point(330, 90), 50, Scalar(0, 255, 0), -1);
    /* 空心橢圓 */
    ellipse(img, Point(460, 90), Size(60, 40), 45, 0, 360, Scalar(255, 255, 0), 2);
    /* 不規則圖形 */
    Point points[1][5];
    int x = 40, y = 540;
    points[0][0] = Point(0 + y, 50 + x);
    points[0][1] = Point(40 + y, 0 + x);
    points[0][2] = Point(110 + y, 35 + x);
    points[0][3] = Point(74 + y, 76 + x);
    points[0][4] = Point(28 + y, 96 + x);
    const Point* ppt[1] = { points[0] };
    int npt[] = { 5 };
    polylines(img, ppt, npt, 1, 1, Scalar(0, 255, 255), 3);
    /* 繪出文字 */
    putText(img, "Test Passed !!", Point(10, 230), 0, 3, Scalar(255, 170, 130), 3);
    /* 開啟畫布 */
    namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);
    imshow("OpenCV Test By:Charlotte.HonG", img);
    waitKey(0);
    return 0;
}
把它存檔存成 opencv.cpp 然後我們手動編譯他,這裡沒有 pkg-config 會有點麻煩,我先不放全部先測試可執行就好(快速點三下選擇全部)
g++ opencv.cpp -o opencv -IC:\opencv341_source\build\install\include -LC:\opencv341_source\build\install\x64\mingw\lib -lopencv_core341  -lopencv_highgui341 -lopencv_imgproc341
說明這裡的的 -lopencv_core341 其實就是路徑
-LC:\opencv341_source\build\install\x64\mingw\lib
內所有的檔案的的名稱,可以使用原始檔名 -llibopencv_core341 一樣意思
因為這裡只有include三個所以就只需要這三個,通常都一次引入全部比較方便
然後執行,執行前要先加環境變數
# 當前CMD暫時加入環境變數
$Env:Path = $Env:Path + ";C:\opencv341_source\build\install\x64\mingw\bin;"

# 執行
./opencv
到這邊就結束瞜,已經可以正常使用了


那一長串的 dll.a 文件怎麼辦

OpenCV341 for MinGW 完整的 dll.a 清單在這裡
-lopencv_aruco341 -lopencv_bgsegm341 -lopencv_bioinspired341 -lopencv_calib3d341 -lopencv_ccalib341 -lopencv_core341 -lopencv_datasets341 -lopencv_dpm341 -lopencv_face341 -lopencv_features2d341 -lopencv_flann341 -lopencv_fuzzy341 -lopencv_hfs341 -lopencv_highgui341 -lopencv_img_hash341 -lopencv_imgcodecs341 -lopencv_imgproc341 -lopencv_line_descriptor341 -lopencv_ml341 -lopencv_objdetect341 -lopencv_optflow341 -lopencv_phase_unwrapping341 -lopencv_photo341 -lopencv_plot341 -lopencv_reg341 -lopencv_rgbd341 -lopencv_saliency341 -lopencv_shape341 -lopencv_stereo341 -lopencv_stitching341 -lopencv_structured_light341 -lopencv_superres341 -lopencv_surface_matching341 -lopencv_tracking341 -lopencv_video341 -lopencv_videoio341 -lopencv_videostab341 -lopencv_xfeatures2d341 -lopencv_ximgproc341 -lopencv_xobjdetect341 -lopencv_xphoto341
恩…又臭又長,可以參考這篇有處理的方法
http://charlottehong.blogspot.com/2018/05/windwos10-pkg-config.html
使用 pkg-config 來處理,跟 linux 一樣,只不過不知道為何 Windows 貌似不能直接用

2018年5月23日 星期三

ubuntu 16.06 安裝 OpenCV3.4.1 contrib 編譯 C++

ubuntu 16.06 安裝 OpenCV3.4.1 contrib 編譯 C++

範例中使用的系統是 ubuntu ,使用其他系統在自己置換一下 apt-get install 即可
懶人包 script 在這裡:opencv341_installer for Ubuntu 16.04


事前準備

# 更新系統
sudo apt-get update
sudo apt-get dist-upgrade -y

# 安裝必要軟件
sudo apt-get install build-essentia
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

安裝 OpenCV

檔案從 OpenCV 的官方git下載,下載指令如下
mkdir opencv341
cd opencv341

git clone -b 3.4.1 https://github.com/opencv/opencv
git clone -b 3.4.1 https://github.com/opencv/opencv_contrib
再來就會自己下載好了然後我們建立一個資料夾準備編譯
mkdir build
cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv

# 開始編譯
make -j8
這邊會跑一小段時間跑完之後就編譯好了,還需要安裝到系統上
cmake 的時候要從網路下載東西,那個會卡很久正常的,能跑好的就等一下吧
# 複製編譯後的檔案套系統目錄內
sudo make install

# 新增執行檔所需要的 lib 庫路徑到環境變數上
sudo ldconfig


測試

編譯的時候使用 pkg-config 幫我們設置路徑,我們先測試一下是否正確安裝OpenCV了
# 察看OpenCV版本
pkg-config -- modversion

# 察看路徑與函式庫
pkg-config opencv --libs --cflags
這邊都ok有看到東西就安裝好了,你應該會看到
3.4.1

-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_cudabgsegm -lopencv_superres -lopencv_stitching -lopencv_cudafeatures2d -lopencv_cudastereo -lopencv_videostab -lopencv_cudaoptflow -lopencv_cudacodec -lopencv_cudaobjdetect -lopencv_cudalegacy -lopencv_cudawarping -lopencv_saliency -lopencv_fuzzy -lopencv_xobjdetect -lopencv_optflow -lopencv_ximgproc -lopencv_hfs -lopencv_bgsegm -lopencv_xphoto -lopencv_xfeatures2d -lopencv_shape -lopencv_bioinspired -lopencv_surface_matching -lopencv_face -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_cudaarithm -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_video -lopencv_ml -lopencv_aruco -lopencv_freetype -lopencv_line_descriptor -lopencv_img_hash -lopencv_dnn_objdetect -lopencv_dnn -lopencv_ccalib -lopencv_reg -lopencv_stereo -lopencv_plot -lopencv_rgbd -lopencv_dpm -lopencv_objdetect -lopencv_structured_light -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_phase_unwrapping -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_cudev
再來讓我們編譯CPP檔案吧,下面是範例代碼,把他儲存為 opencv.cpp
/**********************************************************
Name :
Date : 2016/05/29
By   : CharlotteHonG
Final: 2018/05/23
**********************************************************/
#include <iostream>
using namespace std;

#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char const *argv[]) {
    /* 畫布 */
    Mat img(270, 720, CV_8UC3, Scalar(56, 50, 38));
    /* 直線 */
    line(img, Point(20, 40), Point(120, 140), Scalar(255, 0, 0), 3);
    /* 實心方塊 */
    rectangle(img, Point(150, 40), Point(250, 140), Scalar(0, 0, 255), -1);
    /* 實心圓 */
    circle(img, Point(330, 90), 50, Scalar(0, 255, 0), -1);
    /* 空心橢圓 */
    ellipse(img, Point(460, 90), Size(60, 40), 45, 0, 360, Scalar(255, 255, 0), 2);
    /* 不規則圖形 */
    Point points[1][5];
    int x = 40, y = 540;
    points[0][0] = Point(0 + y, 50 + x);
    points[0][1] = Point(40 + y, 0 + x);
    points[0][2] = Point(110 + y, 35 + x);
    points[0][3] = Point(74 + y, 76 + x);
    points[0][4] = Point(28 + y, 96 + x);
    const Point* ppt[1] = { points[0] };
    int npt[] = { 5 };
    polylines(img, ppt, npt, 1, 1, Scalar(0, 255, 255), 3);
    /* 繪出文字 */
    putText(img, "Test Passed !!", Point(10, 230), 0, 3, Scalar(255, 170, 130), 3);
    /* 開啟畫布 */
    imshow("OpenCV Test By:Charlotte.HonG", img);
    waitKey(0);
    return 0;
}
然後編譯
# 長得很奇怪這沒有打錯,是蚯蚓上的那一撇
g++ opencv.cpp -o opencv  `pkg-config opencv --cflags --libs`
執行確認結果
./opencv
執行出問題 未定義參考到「cv::String::deallocate()」 opencv 可能是剛剛你的設置函式庫路徑沒執行,再重新執行一次 sudo ldconfig


最後是 makefile 檔不過我也正在學習,還不知道通常正規是怎麼寫的,就是一個能跑的而已~
CXX = g++

CXXFLAG :=
CXXFLAG += -O3
CXXFLAG += -std=c++11
CXXFLAG += -Wall

CXXLIBS :=
CXXLIBS += `pkg-config opencv --libs`

CXXINCS :=
CXXINCS += `pkg-config opencv --cflags`

CPPFILES :=
CPPFILES := opencv.cpp

EXEFILE := main

all: opencv
opencv: opencv.cpp
    g++ $(CXXFLAG) $(CPPFILES) -o $(EXEFILE) $(CXXINCS) $(CXXLIBS)

run: opencv
    ./$(EXEFILE)

2018年5月22日 星期二

windwos10 安裝 pkg-config

windwos10 安裝 pkg-config

這個好用在於編譯的時候可以不用打一長串,函式庫的位置與引入檔案,比如說編譯 OpenCV 可以這樣打
g++ source.cpp `pkg-config opencv --libs --cflags`

安裝配置

需要用到的工具是 GTK+ 可以從官方下載,這個工具內帶pkg-config。選中帶有 bundle 的下載就可以用了,需要配置bin到環境變數。
官方下載:http://ftp.acc.umu.se/pub/gnome/binaries/win32/gtk+/
下載完畢把他放到C曹,然後加入他的 bin 到環境變數就可以使用了。
站方懶人包執行就幫你配置好了:CHG懶人包
輸入 pkg-config —version
不過這裡只有他自帶的函式庫才有得用,如果要配置像是OpenCV之類的要自己設置

自訂軟體 config 檔

進入這個位置 C:\gtk+\lib\pkgconfig 然後隨便找一個複製一個現成的改名成 opencv.pc
然後使用文字編輯器開啟,然後把它改成這樣
libdir=C:\opencv341_mingw\x64\mingw\lib
includedir=C:\opencv341_mingw\include

Name: OpenCV341
Description: Loads and saves PNG files
Version: 3.4.1
Libs: -L${libdir} -lopencv_aruco341 -lopencv_bgsegm341 -lopencv_bioinspired341 -lopencv_calib3d341 -lopencv_ccalib341 -lopencv_core341 -lopencv_datasets341 -lopencv_dpm341 -lopencv_face341 -lopencv_features2d341 -lopencv_flann341 -lopencv_fuzzy341 -lopencv_hfs341 -lopencv_highgui341 -lopencv_img_hash341 -lopencv_imgcodecs341 -lopencv_imgproc341 -lopencv_line_descriptor341 -lopencv_ml341 -lopencv_objdetect341 -lopencv_optflow341 -lopencv_phase_unwrapping341 -lopencv_photo341 -lopencv_plot341 -lopencv_reg341 -lopencv_rgbd341 -lopencv_saliency341 -lopencv_shape341 -lopencv_stereo341 -lopencv_stitching341 -lopencv_structured_light341 -lopencv_superres341 -lopencv_surface_matching341 -lopencv_tracking341 -lopencv_video341 -lopencv_videoio341 -lopencv_videostab341 -lopencv_xfeatures2d341 -lopencv_ximgproc341 -lopencv_xobjdetect341 -lopencv_xphoto341
Cflags: -I${includedir}
中間路徑的部分在自己設置自己的位置,然後就可以使用了
pkg-config opencv --modversion
pkg-config opencv --libs --cflags
不過令我意外的居然沒辦法使用在 g++ 命令列上…
就只能當作複製用拉,需要的時候自己打出來自己複製貼上
g++ opencv.cpp `pkg-config opencv --libs --cflags`

2018年3月14日 星期三

OpenCV Mat 讀取數值錯誤,如何讀出正確數值

OpenCV Mat 讀取數值錯誤,如何讀出正確數值

在做仿射轉換的時候發現讀出來的數值都怪怪的,找了很久,後來才想到應該是要用 double,下面是讀取的範例。
    //選定幾何轉換前後相對的三個點
    Point2f srcTri[3];
    srcTri[0] = Point2f(0, 0);
    srcTri[1] = Point2f(10, 0);
    srcTri[2] = Point2f(0, 10);

    Point2f dstTri[3];
    dstTri[0] = Point2f(10, 10);
    dstTri[1] = Point2f(20, 10);
    dstTri[2] = Point2f(10, 20);

    Mat warp_mat = getAffineTransform(srcTri, dstTri);

    cout << warp_mat << endl;
    cout << "=========================" << endl;

    for(size_t j = 0; j < warp_mat.rows; j++) {
        for(size_t i = 0; i < warp_mat.cols; i++) {
            cout << warp_mat.at<float>(j, i) << ", "; // 錯誤
            //cout << warp_mat.at<double>(j, i) << ", "; // 正確
        } cout << endl;
    } cout << endl;

2018年3月2日 星期五

OpenCV 如何編譯 contrib -- 懶人包批次檔

OpenCV 如何編譯 contrib 指令快速編譯批次檔

寫成批次檔可以自動下載,版本變動的時候自行更改即可~


開源

製作過程並沒有什麼技術含量,主要是還是debug時間最多,一堆沒想到的奇爬問題一直出現,把它寫出來給我自己看方便之後維護文章,有興趣的話也可以看看是怎麼實現全自動編譯的。
我的實現目的是只要輸入版本號,就可以自動在windwos上編譯完成。
版本號對應的方式如下
rem 設置 OpenCV 版本
set cv_version=4.0.1

rem 下載Opencv
git clone -b %cv_version% https://github.com/opencv/opencv
git clone -b %cv_version% https://github.com/opencv/opencv_contrib
首先條件要先達成安裝最新版的 cmake 跟 git,尤其是cmake的這個必須跟著opencv升級,否則編譯過程會出錯,升級的話麻煩的,最後我是放棄了搞些什麼辦法了,直接附在安裝包一起省事。
下載的網址個別是:
值得注意的是,有些人的電腦上已經安裝過了,解決辦法是下載攜帶版,直接開攜帶版的exe而不直接在命令內使用 git 或 cmke。
對應的辦法像這樣
rem 設置 git 與 cmake 位置 (如已安裝環境變數可略過)
set gitPath=Git\bin
set cmakePath=cmake\bin

%~dp0%gitPath%\git
%~dp0%cmakePath%\cmake
再來就是讓cmake自動產生make檔案,語法跟linux差不多,長這個樣子
rem 設置 cmake 參數
set build_dir=build_contrib
set source_dir=opencv
set modules_dir=opencv_contrib\modules
md %build_dir%
cd %build_dir%

rem 建立 cmake 檔案
%~dp0%cmakePath%\cmake -G %mode% -DOPENCV_EXTRA_MODULES_PATH="%~dp0%modules_dir%" "%~dp0%source_dir%"
最後打開 Visutal Studio 來編譯吧~其實這裡有語法,只是沒查到不知道去哪裡找QuQ就算惹,剩最後一部只是按右鍵編譯。
有人知道怎麼操作指令的話~還請留言教一下XD
具體操作是先按 ctrl+shift+b 編譯,編譯完畢之後檔案其實就已經有了。
要輸出到同一個資料夾可以按,左邊 CMakeTargets -> INSTALL 右鍵 然後 按 J 在案B,自動幫你把全部整理到名為 INSTALL 的資料夾。
然後要上面編譯要做兩次,一次是 debug 模式一次是 release 模式,從VS上方選單切換。

批次檔內容

cmake OpenCV contrib_v3.bat
rem @echo off
Title dismInstall By Charlotte.HonG

rem 設置 OpenCV 版本
set cv_version=4.0.1
rem 適用的VS版本[可以用 cmake -G 看到其他選擇]
set mode="Visual Studio 15 2017 Win64"

rem 設置 git 與 cmake 位置 (如已安裝環境變數可略過)
set gitPath=Git\bin
set cmakePath=cmake\bin
path=%path%;%~dp0%gitPath%;%~dp0%cmakePath%

rem 下載Opencv
%~dp0%gitPath%\git clone -b %cv_version% https://github.com/opencv/opencv
%~dp0%gitPath%\git clone -b %cv_version% https://github.com/opencv/opencv_contrib

rem 設置 cmake 參數
set build_dir=build_contrib
set source_dir=opencv
set modules_dir=opencv_contrib\modules
md %build_dir%
cd %build_dir%

rem 建立 cmake 檔案
%~dp0%cmakePath%\cmake -G %mode% -DOPENCV_EXTRA_MODULES_PATH="%~dp0%modules_dir%" "%~dp0%source_dir%"

rem  打開 VS
start "" "OpenCV.sln"
CreateList.bat
::@Echo Off
Title CreatList - By:Charlotte.HonG

set FILENAME1="DebugLib_Lists.txt"
set FILENAME2="ReleaseLib_Lists.txt"

set LIBPATH=%~dp0build_contrib\install\x64\vc15\lib
set LISTPATH=%~dp0build_contrib\install\x64\vc15\bin
set INCTPATH=%~dp0build_contrib\install\include\opencv2

::Lib清單
cd %LIBPATH%
dir *d.lib /b /on> %~dp0%FILENAME1%
dir *401.lib /b /on> %~dp0%FILENAME2%

::路徑清單
echo %INCTPATH%> %~dp0%PathList.txt
echo %LIBPATH%>> %~dp0%PathList.txt

exit