2012-06-05 72 views
0

它的另一個OpenCV問題。我喜歡這個東西,但它會嚴重地驅使你瘋狂。沒有匹配函數調用cvGet2D

問題:我正在iOS上爲iPhone開發項目,是OpenCV。我不知道我是否有一個壞框架或什麼。

這工作:

cv::Canney() 
cv::adaptiveThreshold() 

但是,當我嘗試

"cvGet2D()" (without previous "cv::") 

我得到的錯誤:調用 'cvGet2D'

當我只需鍵入「cvGet2D沒有匹配的功能()「它顯示在代碼提示中,暗示它至少找到頭文件?當我嘗試鍵入「cv :: get2D」或「cv :: cvGet2D」時,什麼都不顯示。我很沮喪,因爲我安裝的OpenCV框架仍然感覺像一個我不明白的黑盒子。

具體來說,你認爲它可以對開發與未開發以及鏈接正確的庫有什麼關係嗎?只是把東西扔到那裏。

非常感謝大家。我真的很感激,不能等到我有足夠的智慧回饋一些。

編輯:

因此,最新的嘗試澄清。

cv::cvGet2D(results,0,0); 

新的錯誤是:在命名空間 'CV' cvGet2D 「「命名任何成員」;

這裏的任何想法

多個編輯:再次

感謝您的答覆.. 4小時後,還有幾杯咖啡,我仍然感到困惑,如果我搞砸了命名空間,爲什麼cv :: adaptiveThreshold這樣的東西可以正常工作,但cv :: get2D沒有顯示出來?它嚴重地導致了大腦出血。

所以,看起來我應該選擇C或C++版本的解決方案。建議您提供任何提示。我會補充說我在我的界面中有:#import <OpenCV/opencv2/opencv.hpp>。然後導入核心庫,我可以看到cvGet2D的結構。再次感謝。

進展!

這些是我的新想法。

cv::Mat tempMat = [self.imageView.image CVMat]; 
cv::Mat testMat = tempMat(cv::Rect(0,0,2591, 1)); 
cv::Mat templateMat = tempMat(cv::Rect(0,0,100,1)); 

cv::Mat results; 


cv::matchTemplate(testMat, templateMat, results, CV_TM_CCOEFF_NORMED); 

typedef Vec<float, 2> Vec2f; 

Vec2f& elem = results.at<Vec2f>(0 , 35); 

float value1 = elem[0]; 
float value2 = elem[1]; 

因此,也許它應該使用?切?也許,但它似乎在做一些事情。新的問題,wtf做了一個matchTemplate輸出?它的1行,在這種情況下2492列。我想我的問題是,如果(0,35)的值超過一個數字? elem [0]和elem [1]代表什麼?正如你可能知道的那樣,我只是從一張圖片中取出一行,並用它的一小塊作爲模板。該照片包含垂直線條,所以我希望能夠確定線條彼此之間的距離。是的,它的錯綜複雜。但是,爲了這個討論的目的,實際上應該只有一行,並且一系列的列爲每個比較輸出一個相關係數,因爲它是正確的?

再次感謝你的男人,夥伴,夥計們,老闆們和你們所有聰明的羣衆!

+0

現在你問一個完全不同的問題。 Stack Overflow遵循每題一個答案的風格,所以如果你不斷改變這個問題,對那些試圖幫助你的人來說是不公平的。正確的過程應該是:將問題還原爲前一個問題,選擇解決問題的答案,並在新線程中提出新問題。 – karlphillip

回答

1

您可能正在使用OpenCV 2.0的C++ API。

函數被移動到cv命名空間。

您可以在之前使用cv::或將using namespace cv;添加到您使用它們的文件的起始位置。

參考:http://www.aishack.in/2010/07/opencvs-c-interface/

編輯:

還請確保您所有的大寫字母糾正:

如果你使用cv::cvGet2D(img,i,j)或者(如果包括命名空間)應該編譯只是cvGet2D(img,i,j)

+0

感謝您的快速回復!當我使用「cv :: get2D」時,它不會註冊爲一個函數。奇怪的是,它可以用於「cv :: canny」和「cv :: adaptiveThreshold」。 – justagruvn

+0

這裏不應該是大寫字母G嗎? - cv :: cvGet2D(img,i,j)與cv:get2D或cv不同:cvget2D –

+0

@justagruvn:我編輯了我的答案,希望它可以幫助 –

1

首先,有沒有這樣的事情cv::cvGet2D()

名稱cvGet2D()表示它屬於OpenCV的C接口,但您似乎正在使用C++接口。你知道,混合它們並不好。僅供參考,該功能可在opencv_core庫中找到。

該錯誤消息告訴您無法在您聲明的頭文件中找到此函數,因此您似乎錯過了正確的頭文件。嘗試#include <cv.h>

編輯:

由於對這個問題的最新更新,我還必須補充一點,但也沒有這樣的東西作爲cv::get2D()。不要試圖將命名空間放在cvGet2D()左右,這是來自C接口的函數,C語言中沒有命名空間。

+0

我真的很感激你的迴應。所以,我很明顯是新的。我試過包括,它似乎沒有解決任何問題。它讓我想起它可以爲cvGet2D編碼提示,但是當你填寫字段時,它說它找不到該函數。你有什麼想法爲什麼這樣做?我在C的核心下的文檔,但我使用C++ ?.我知道你會嘔吐,癲癇發作,在這個問題上失去對腸胃的控制,但如果我不想混合他們,你有什麼建議嗎?我正在嘗試讀取cvMatchTemplate的結果給出1列mny行 – justagruvn

+0

爲什麼不簡單使用C接口或C++接口?兩者實現基本相同的功能。不過,C++接口提供了額外的額外功能。這些接口不應混用。這會造成問題和困惑。 – karlphillip

+0

我覺得我太無知了,我甚至不知道我在用哪一個。我將如何使用C++來做到這一點?會有什麼不同?我覺得我的困惑來了,因爲我已經在Xcode中使用了某種形式的Objective C,所以我開始嘗試添加這些其他的東西,而這隻會讓noob變得雜亂無章。 – justagruvn