伊莉討論區

標題: [已解決]VS2008 使用opencv findcontour出了問題 [打印本頁]

作者: 龍謙    時間: 2018-2-25 05:27 PM     標題: [已解決]VS2008 使用opencv findcontour出了問題

本帖最後由 龍謙 於 2018-3-20 08:56 PM 編輯

各位大大好:
小弟用visual studio 2008 + opencv 2.3.1 寫了一支演算法,
單獨使用沒問題,但一放到公司的程式上就出現了問題了。

小弟先來說明一下單獨建立一個專案時,使用沒問題的情形:
使用imshow這個函式顯示Mat時,視窗的名字是正確的
[attach]122389730[/attach]

在進去findcontour前,向量contour的值為零,
[attach]122389728[/attach]
經過findcontour函式後,裡面儲存了所有輪廓的座標
[attach]122389724[/attach]

但整合到公司的程式後,就出現問題如下:
1.顯示imshow顯示Mat的視窗跑出兩個,兩個的名稱都是亂碼,
而且只有其中一個可以拉大拉小(我imshow的第二個參數flag是給0),另一個則顯示原圖大小。
[attach]122389727[/attach]

2.在使用findcontour函式後,contour這個vector裡的值全亂掉了。
進findcontour前一切安好,向量contour的值為零:
[attach]122389726[/attach]
但經過findcontour後,contour的值全亂掉:
[attach]122389725[/attach]



我們公司的習慣,演算法無論是用什麼函式庫寫的,
都會把演算法包成一個類別,且會有一個接口的方法,
傳入、傳出的參數都是公司程式裡訂好的結構。
所以小弟在寫演算法時,就會先把接口做好,
也會額外寫一個測試程式,模擬整合進公司程式的情形,減少整合時的問題。
所以當遇到這個問題時覺得超奇怪的,
上網查了許多資料,有遇到一樣問題的說有可能是不同命名空間的vector定義有不同,
所以在公司的程式碼中,都有特別宣告是哪個命名空間(cv::   ) 的,但這個方法最後還是失敗。

也試其他的方法:先宣告contour的大小(我設10000)、改過屬性中執行緒及MFC dll的設定等等,
都還是沒用。
後來有想到把公司程式的屬性設定改成跟測試的專案一樣,結果公司的程式就出現一堆error。

請問有沒有其他大大遇到一樣的問題,或是知道解決方法的呢?

作者: caoh    時間: 2018-2-25 09:04 PM

如果是 std::vector 定義不同,那不會是命名空間的問題,是版本問題

比如說你的 opencv 是某個版本 vc 編出來的 dll 而你的程式用的是另一個版本的 vc

但這樣也很奇怪,因為 c++ 有名稱修飾的問題,按理說每個版本的修飾法則不同

如果你採用動態連結而非動態載入,會因為 link error 而編不出程式,但事實是你已經可以執行了

後來有想到把公司程式的屬性設定改成跟測試的專案一樣,結果公司的程式就出現一堆error。

是哪種 error 呢?

不過我沒用 opencv 不知道問題是啥,只是提一下疑惑而已

作者: 龍謙    時間: 2018-2-25 09:46 PM

caoh 發表於 2018-2-25 09:04 PM
如果是 std::vector 定義不同,那不會是命名空間的問題,是版本問題

比如說你的 opencv 是某個版本 vc 編 ...

不好意思,表達不清楚
先回答c大的最後一個問題,opencv 是一個開放原始碼的影像處理的函式庫。
而我使用的opencv的版本是用vs 2008編出來的沒錯,所以版本一樣。
我問題中題到的「有遇到一樣問題的說有可能是不同命名空間的vector定義有不同」,是指我在網路上查我遇到的問題發生的原因時,有網友遇到跟我一樣的問題,另一位網友這樣回答他,並建議他把findcontour用到的vector都加上命名空間cv。

c大的問題是「會不會是連結opencv所造成的error」嗎?
如果是的話,我覺得應該不是link error,
因為那是我把公司的程式的屬性設定改成跟測試專案一樣時遇到的error,
那些error很奇怪,有error C1189 、C3816、......等等,error如下[attach]122392711[/attach]
感覺那些都是跟編譯器屬性設定有關的error

作者: 龍謙    時間: 2018-3-20 08:55 PM


感恩caoh大大的提點,小弟找到了解決方法了!
caoh大大當時提出了opencv引入函式的錯誤像是連結器連結錯lib或是編譯環境有問題,於是將公司程式的設定改成跟測試版的一樣:
專案的屬性頁->程式碼產生->執行階段程式庫,並選擇「多執行緒(/MT)」,這個部分絕不可以是(/MTd),其他的我還沒試過
[attach]122676730[/attach]


但修改後會出現函式找不到的error,情形如下圖
[attach]122676717[/attach]


後來小弟到網路上找到了error C1189的解決方法(http://www.voidcn.com/article/p-ubnsiqyh-gd.html)
屬性頁的「C/C++」->前置處理器,在「前置處理器定義」處加上「_AMD64」。
[attach]122676719[/attach]


這樣就都解決了!












歡迎光臨 伊莉討論區 (http://www3.eyny.com/) Powered by Discuz!