0

它的另一个 OpenCV 问题。我喜欢这些东西,但它真的会让你发疯。

问题:我正在为 iPhone 的 iOS 开发一个项目,是的 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]; 

那么,也许应该使用 .at ?切线?也许吧,但它似乎在做些什么。新问题,wtf 会输出 matchTemplate 吗?它有 1 行,在本例中为 2492 列。我想我的问题是,(0,35) 处的值是否应该超过一个数字?elem[0] 和 elem[1] 代表什么?您可能会说,我只是从一张图片中取出 1 行,并使用其中的一小部分作为模板。照片包含垂直线,所以我希望确定这些线之间的距离。是的,它令人费解。但是,出于本次讨论的目的,真的应该只有 1 行和一系列列,这些列在每个比较正确移动时输出相关系数?

再次感谢伙计们、伙伴们、小伙子们、小伙子们,以及你们所有聪明的群众!

4

3 回答 3

1

首先,没有cv::cvGet2D().

名称cvGet2D()表明它属于 OpenCV 的 C 接口,但是,您似乎使用的是 C++ 接口。混在一起不好,你知道的。仅供参考,这个函数在 opencv_core 库中可用。

错误消息告诉您它无法在您声明的标头中找到此函数,因此您似乎缺少正确的标头。尝试#include <cv.h>

编辑:

由于您对该问题的最新更新,我还必须补充一点,也没有cv::get2D(). 停止尝试在周围放置命名空间cvGet2D(),这是来自 C 接口的函数,C 语言中没有命名空间。

于 2012-06-05T22:48:11.607 回答
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)

于 2012-06-05T20:40:42.457 回答
0

使用 Mat_ 类怎么样?它可以从垫子上铸造。

Mat_<Vec3b>& M_ = (Mat_<Vec3b>&)M;
for(int i = 0; i < M_.rows; i++)
    for(int j = 0; j < M_.cols; j++)
        M_(i,j) = cv::Vec3b(0,255,0); // Fill Green

也可以看看

http://docs.opencv.org/modules/core/doc/basic_structures.html#id7

于 2013-03-24T05:15:54.020 回答