2012-06-05 74 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