2017年6月21日 星期三

[圖文] OpenCV 3.4.1 安裝配置在 Visual Studio 2017

[圖文] OpenCV 3.4.1 安裝配置在 Visual Studio 2017

想快速安裝可以從這邊,我有寫一個懶人包,執行就會自動幫你配置好專案的設置
https://charlottehong.blogspot.tw/2017/12/opencv320-contrib.html
以下本文(本站)內容的圖片點擊即可放大,ESC即可回到文章
本文使用的系統為 Win10 ,使用的編譯器為 Visual Studio 2017 版本為 2018.7 月最新版。

正文開始

先到官方下載這兩項軟體 (點擊有連結)
關於 Visual Studio 2017 如何安裝可以參考 https://charlottehong.blogspot.com/2018/09/c-visual-studio-2017.html
建議直接解壓縮到C槽,本文範例即直接解壓縮到C


文件說明

build文件是官方已經幫你預先編譯好的檔案,開進去
C:\opencv\build\x64\vc15\bin
可以看到vc15 的字樣,這是給 visual studio 2017 用的。
總而言之會用到的只有
  • C:\opencv\build\include
  • C:\opencv\build\x64\vc15


部屬 OpenCV

首先只要做一次就好的是
  • 系統環境變數加入 bin 路徑
編譯器大概需要三個步驟(每次第一次開新專案)
  • 編譯器加入 include 路徑
  • 編譯器加入 lib 路徑
  • 編譯器加入 lib 檔案

環境變數(說明文字在圖下)

搜索一下你的電腦環境變數或系統內容都可以(也可以直接對著本機按右鍵內容)
(點擊放大)位置是:C:\opencv\build\x64\vc15\bin
如果在設定環境變數之前就已經先打開 Visual Studio 的話,需要重新啟動 Visual Studio ,沒有重開編譯的時候會出現 “找不到**.dll檔案”

設定編譯器

打開新專案
選擇傳統式精靈,專案名稱就隨意打一個不影響
打勾空白專案,(這裡其實可選,文章為方便撰寫使用空白專案)
再來對著專案按右鍵新增檔案
可以改名字,這邊我就直接按新增了
再來要進入設定裡面設置,留意一下紫色的框框待會會用到
乾!悲劇了,以下 紫色框框均要選 x64 模式 因為OpenCV 提供的預編檔案只有x64
乾!悲劇了,以下 紫色框框均要選 x64 模式 因為OpenCV 提供的預編檔案只有x64
乾!悲劇了,以下 紫色框框均要選 x64 模式 因為OpenCV 提供的預編檔案只有x64
進來之後對照一下紫色框框,兩個要一樣才有用(總共會有4種組合)
貼上include的路徑:C:\opencv\build\include
這裡貼上 lib 的路徑:C:\opencv\build\x64\vc15\lib
一樣留意一下紫色的框框
這裡需要指定引入那些 *.lib 檔案
我們進來opencv的文件裡面看
根據你的模式設定(留意紫色框框)
好了之後貼上測試代碼
/**********************************************************
Name :
Date : 2016/05/29
By   : CharlotteHonG
Final: 2016/05/29
**********************************************************/
#include <iostream>
#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);
    /* 開啟畫布 */
    namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);
    imshow("OpenCV Test By:Charlotte.HonG", img);
    waitKey(0);
    return 0;
}
留意一下紫色框框是不是跟你剛剛設定的一樣 (這邊我已經發現錯了改回x64)
如果你做到這邊才發現錯了,要回去重做,設定裡面 x86->x64 改了全部會歸零歐

運行

設定好之後直接按F5運行吧~~
出現找不到 dll 檔案,重新啟動一下 Visual Studio 2017 。


其他

如果需要完整的OpenCV功能,比如說 SIFT 等這些實作需要自己重新編譯,重新編譯可以參考這篇站內文,手動編譯原始檔的方法。
http://charlottehong.blogspot.com/2017/07/opencv-320-contrib-visual-studio.html

70 則留言:

  1. 你好,想請問為何我的visual沒有w32主控台應用程式?

    回覆刪除
    回覆
    1. 2017這幾周剛改版,位置變動了。可以查看這篇站內文
      https://charlottehong.blogspot.tw/2017/09/visual-studio-17-win32.html

      刪除
  2. 您好~~ 我照著步驟設定

    Path 也已經設定好了 平台也選擇x64 但是我下載的是opencv3.3 所以
    我的lib檔案我選擇 opencv_world330d;%(AdditionalDependencies)

    但是執行時 會出現

    無法開啟檔案 'opencv_world330d.obj' 請問是怎麼回事呢?

    回覆刪除
    回覆
    1. 這幾天我在試試看新版的

      刪除
    2. 沒有出現這個錯誤正常執行,照著步驟重做一次試試看。
      bin路徑要用x64/vc14/bin 才是正確的。

      刪除
  3. 你好~我遇到了一點問題

    在執行時出現一段錯誤訊息:{ 程式碼無法繼續執行,因為找不到 opencv_world330d.dll} 想請問如何解決?

    回覆刪除
    回覆
    1. 可能是環境變數那個步驟出問題

      刪除
    2. 嗯..今天才發現截圖中的一個步驟出錯了,環境變數那邊的路徑我貼錯了。

      刪除
    3. 作者已經移除這則留言。

      刪除
    4. 我也遇到一樣的情況,但最後是把dll複製到執行目錄才找到dll的

      刪除
    5. 環境變數的路徑設錯,圖片中的錯了,圖底下的文字有說明正確的路徑。

      刪除
    6. 或者是VC在設置環境變數之前就己經開啟,重開就好了。

      刪除
  4. 請問~在偵錯時說專案已過期是為甚麼呢~

    回覆刪除
  5. 你好,我下載的Lib檔案中是opencv_world331d.lib,我是自動把輸入裡面其他相依性的路徑也改成331嗎?

    另外,想要詢問如果跑出 main 在opencv.test.main.obj中已經定義過了(LNK2005),且說一個或以定義的符號(LNK1169)。請問是出了什麼問題。

    謝謝

    回覆刪除
    回覆
    1. 那個,我好像解決了。
      把下載的檔案名稱改成別的就沒有衝突了

      抱歉,打擾了

      刪除
    2. 不會啦,沒關係~解決就好

      刪除
  6. 請問一下 我一直開啟不了 來源檔案 這是?哈哈 不太懂
    #include

    回覆刪除
    回覆
    1. 中間環境變數圖片位置有錯,底下文字說明才是正確的,看看是不是這個的關係,改變環境變數後,要重啟VS2017

      刪除
  7. 你好,我想稍微問一下,按照了樓主的教學,我成功的安裝好了Opencv,但再按下F5後,並沒有顯示完整的圖片,而是出現灰色的畫布後,畫布閃一下,程式自動關閉,很像沒有觸發waitkey一樣。

    但我後來靠imwrite跑程式後,確實有產出一個正確完整的圖片,不知道是什麼原因? 謝謝

    回覆刪除
    回覆
    1. 想請問安裝的版本是範例中的版本嗎~

      可能有那裡有沒設定好或是怎麼樣,檢查一下有沒有把原本應該是 Debug 要用的檔案設定給 release 使用或是反過來之類的狀況。

      刪除
  8. 我的畫布也是閃一下就關閉了,不知如何解決。

    回覆刪除
  9. 我在開啟畫布加上這一列就可以看到了

    /* 開啟畫布 */
    namedWindow("Display window", WINDOW_AUTOSIZE);

    回覆刪除
    回覆
    1. waitKey(0); 本身就是暫停的功能了,我也不清楚沒有暫停的原因是什麼,按道理照著做應該會暫停的。
      > 不過有解決就好~其他人有問題的也可以試試看這一個方法

      為什麼不能按照原本的代碼暫停想請問
      1. 使用的opencv版本是否一致。
      2. 程式碼複製的時候是否漏了那一行。

      刪除
  10. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 沒錯呀 本文圖中剛建立的時候也是這樣,只有4個
      並不是對來源檔案按右鍵,可以參考本文圖中說明,點擊可看大圖。

      刪除
  11. 你好,請問我方案總管中只有 外部相依性/來源檔案/資料檔/標頭檔,其中的來源檔案就是原始程式檔嗎?

    回覆刪除
    回覆
    1. 更新一下你的VS,然後重建一個新專案,應該就一樣了

      刪除
    2. 是昨天才安裝好的2017

      刪除
    3. 了解~沒關係一樣的東西

      測試了一下全新安裝的名稱是你的那樣沒錯,我的可能是舊版本升級上的名稱是那樣。

      刪除
    4. 請問新增專案時空專案和WIN32的差別在哪裡?
      我利用你的測試碼時使用空專案無法建置,而使用WIN32才可以
      因為我自己有買書來看,但書上都是新增空專案來執行

      刪除
  12. 你好,我照上面的步驟做完之後按下F5,畫面一閃就結束了。
    我在程式碼尾端加上system("pause");後,畫面成功停住,但"OpenCv Test By:Charlotte.HonG"的視窗裡沒有圖形,我是否有哪個步驟做錯了呢?

    回覆刪除
    回覆
    1. 前面推文的方法試試看~我有加進文章了,你可以重新複製看看

      或者是加入
      namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);

      刪除
    2. 文章的最開頭有懶人包,你試試看那個,裡面有我配置好的專案。
      如果懶人包執行是正常的,那應該就是其中一個步驟弄錯意思了。

      刪除
    3. 已成功顯示畫面了,感謝版主!

      刪除
    4. 最後是用哪個方法實現的

      刪除
    5. 是使用前面推文的方法完成的。

      刪除
  13. Visual Studio 2017 我測試應該要用vc15,用vc14會有無法開啟錯誤

    回覆刪除
    回覆
    1. 感謝提醒,因為 VS2017 橫跨了兩個版本(內部版本是 14.0 與 14.1),文章沒更新。(我其實也沒注意到有多這個文件)

      在2017年的時候使用 opencv320 是 VC14 的文件,後來改版後的opencv341內有 VC15 與 VC14 。

      VS2017 -> VC15 文件
      VS2015 -> VC14 文件

      刪除
  14. 感谢您分享这篇文章,不知可否摘取其中部分内容(方法和代码)进行转载?我会在转载中注明本文地址。(PS:看到上面一条留言说 VC14 和 VC15 的问题,我这边 vs2017 使用 VC14是正常的,仅此一提,大家还是要自行测试一下)

    回覆刪除
    回覆
    1. 好的 請保留ID及原文網址~~(不過沒有科學上網是不是連不過來啊QuQ)

      我是還沒實際跑 15 跟 14 的差異,根據我在安裝 cuda9.0 的時候因為 VS2017 版本的更新導致不能用,必須從 14.1 降版到 14.0,直覺就覺得說或許 vc15 是給內和版本 14.1 用的;這幾天跑跑看會在更新結果。

      刪除
    2. 哇,感谢。是要科学上网才行(很不方便(T_T)),大陆找到一些文章都不太实用。看您博客有好多好文章,以后会常常访问,再次感谢。

      刪除
  15. 感謝大大~ 找了一堆資料 照著這個做終於成功

    回覆刪除
  16. 執行程式時,出現對話框找不到檔案C:\Users\user\source\repos\opencv_test\x64\Debug\opencv_test.txt,實際看資料夾裡面也沒有,不知道哪裡出錯了

    回覆刪除
    回覆
    1. 還蠻奇怪的~應該是有那裡弄錯,重新開一個新的重新做一次看看

      刪除
  17. 你好我照上面完成設定
    在編寫時候語法是沒有報錯的
    但是編譯的時候錯誤一堆,關於openCV的一切function,常數,命名空間 都會報錯說是找不到識別項,為了好說明我用一個簡短的code
    以下code
    #include
    #include
    #include
    #include
    #include "stdafx.h"
    using namespace cv;

    int main()
    {
    printf("I must confess that I feel like a monster");
    Mat img = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    /*imwrite("output.jpg", img);

    namedWindow("Display window", WINDOW_AUTOSIZE);
    imshow("Display window", img);
    waitKey(0);

    return 0;*/
    }
    在編譯時會報錯:
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C2871 'cv': 此名稱的命名空間不存在 ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 8

    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C2065 'CV_LOAD_IMAGE_GRAYSCALE': 未宣告的識別項 ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C2065 'img': 未宣告的識別項 ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C3861 'imread': 找不到識別項 ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C2065 'Mat': 未宣告的識別項 ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 C2146 語法錯誤: 遺漏 ';' (在識別項 'img' 之前) ConsoleApplication2 c:\users\sasalicat\source\repos\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13
    ---------------------------------------------------------------
    我覺得這個問題的原因是linker在檢查lib時沒有找到以上所有東西,因為只有在編譯時才會報錯,在編寫時編譯器沒有檢查出錯誤,但我怎麼也看不出我有哪裡設置錯誤
    以下是一些設置
    其他Include 目錄:D:\openCV\3.4.1\opencv\build\include;%(AdditionalIncludeDirectories)
    其他程式庫目錄:D:\openCV\3.4.1\opencv\build\x64\vc15\lib;%(AdditionalLibraryDirectories)
    其他相依性:opencv_world341d.lib;opencv_world341.lib;%(AdditionalDependencies)

    環境變數我也設置了
    希望大大指點,我真的束手無策了

    回覆刪除
    回覆
    1. 注意到你的內文使用的代碼並不是教學中的代碼,而且看起來並不完整不確定出什麼狀況,你說有照著有照教學走我覺得很奇怪~

      建議先從頭照著教學走試試看~不行可以在提出來討論。認真說~如果交叉著兩篇教學混合我也很難找出問題~

      刪除
  18. 您好,小弟有兩個問題想請問一下:
    1. 在Windows桌面專案那張圖中,我在勾選時為什麼空白專案(E)與先行編譯標頭檔(P)無法同時勾選?
    2. 在OpenCV_test屬性頁那張圖中,顯示的是 平台(P):作用中(Win32), 而我在操作時為什麼是顯示 平台(P):Win32

    而我按F5後會顯示: 建置發生錯誤 要繼續並且執行上次成功的組建嗎?
    按"是"後會顯示: 無法啟動程式 'C:\User\Marlarkey\source\repos\OpenCV_test\x64\Debug\OpenCV_test.exe' 系統找不到指定的檔案

    希望板主大大能救救我><

    回覆刪除
    回覆
    1. 1 的先行編譯會產生一個 xxxx.h 可以建一次看看空白專案內不會有這個,就不讓你打勾了。不過取消先行編譯跟打勾空白專案是否相等這個我不確定。

      2. 是不是有什麼字變成亂碼了? 注意到你提到win32,應該是要選x64,教學圖中是我選錯了內文有說明。看來還是不能偷懶~這幾天會修正。

      3. 可能是2導致的

      刪除
  19. 重新做了兩次
    還是失敗
    請大大求解
    第一行都是
    嚴重性 程式碼 說明 專案 檔案 行 隱藏項目狀態
    錯誤 (作用中) E1696 無法開啟 來源 檔案 "opencv2/opencv.hpp" test C:\Users\User\source\repos\test\test\Source.cpp 2

    試過改更v15的那個部分
    還是沒有用

    回覆刪除
    回覆
    1. 文章是有一小段時間了,我正在嘗試從全新的 win10 照著本文安裝實測,有變動會新增上來。

      刪除
    2. 驗證ok文章還是堪用的~
      檢查一下 include 路徑裡面是不是真的有東西。

      刪除
    3. include 路徑 也重新檢查過了
      我朋友照做也有成功
      但我的就是炸裂
      都跳出
      C++ 無法開啟 來源 檔案 "opencv2/opencv.hpp"

      刪除
    4. 總算解決include問題
      但是跳出新的問題
      無法開啟opencv world_343d.lib

      刪除
    5. 這在 bin 路徑底下,檢查一下是不是沒設好環境變數。可以試著找你從朋友看著你從頭照著做一次,可能是某些地方誤會文章意思或是做錯,但是本身沒發覺。

      刪除
  20. 執行後說 程式碼執行無法繼續,因為找步道MSVCP110D.dll

    回覆刪除
  21. #include
    #include
    using namespace cv;

    int main() {
    Mat src = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
    Mat src_gray = imread("lena,jpg", CV_LOAD_IMAGE_GRAYSCALE);
    Mat contoursImg = src.clone();

    Mat edge;
    blur(src_gray, src_gray, Size(3, 3));
    Canny(src_gray, edge, 50, 150, 3);

    vector> contours;
    vectorhierarchy;
    RNG rng(12345);
    findContours(edge, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
    for (int i = 0; i < contours.size(); i++) {
    Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), 255);
    drawContours(contoursImg, contours, i, color, 2, 8, hierarchy);
    }
    imshow("origin", src);
    imshow("result", contoursImg);
    waitKey(0);

    return 0;
    }
    我這個程式執行後會跳出例外狀況"0x00007FFF49DA4008 中 (於 Project2.exe) 發生未處理的例外狀況"
    然後會跑出一個視窗寫"OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat,"
    環境設定也設定過了都調好了
    上網google也找不到解決方法
    不知道問題是出在哪呢?
    ( 我是用Visual Studio 2017 ; opencv 2.4.13版 vc14 )

    回覆刪除
    回覆
    1. 先試試看文中的做法吧,另外2413提供的預編譯檔案不一定能給2017最新版用,看情況可能需要重編。

      刪除
  22. 文章中解決沒找到include問題
    圖片上錯誤的
    C:\opencv3.4.1\opencv\build\include
    謝謝您的教學已經成功在新的2017 IDE編輯Opencv !!

    回覆刪除
  23. 感謝分享 已經成功編譯了

    回覆刪除
  24. 請問 F5執行後錯誤是

    錯誤 C1010 尋找先行編譯標頭檔指示詞時碰到未預期的檔案結尾。您的原始檔中是否忘了加上 '#include "stdafx.h"'?

    想請問大大 苦惱很久Q_Q

    回覆刪除