2012-04-25 85 views
1
OpenCV的features2d

我想在iOS上通过OpenCV的使用特征检测和我遇到了一个难题:使用iPhone上

features2d依靠highgui highgui无法在iOS内置(或至少不是我能弄清楚)。

这使我相信:features2d只是不能在iOS上使用,而不重写模块以去除对cvSaveImage()和cvLoadImage()的调用。这是错的吗?任何人遇到这个并解决它?

回答

4

您正在采取错误的措辞,您不需要highgui,因为该库只是为了让您更轻松地处理处理结果,您可以简单地手动执行这些步骤。

例如,考虑这个HOG例如:

#include <iostream> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/objdetect/objdetect.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int 
main(int argc, char *argv[]) 
{ 
    const char *imagename = argc > 1 ? argv[1] : "../../image/pedestrian.png"; 
    cv::Mat img = cv::imread(imagename, 1); 
    if(img.empty()) return -1; 

    cv::HOGDescriptor hog; 
    hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); 

    std::vector<cv::Rect> found; 
    // 画像,検出結果,閾値(SVMのhyper-planeとの距離), 
    // 探索窓の移動距離(Block移動距離の倍数), 
    // 画像外にはみ出た対象を探すためのpadding, 
    // 探索窓のスケール変化係数,グルーピング係数 
    hog.detectMultiScale(img, found, 0.2, cv::Size(8,8), cv::Size(16,16), 1.05, 2); 

    std::vector<cv::Rect>::const_iterator it = found.begin(); 
    std::cout << "found:" << found.size() << std::endl; 
    for(; it!=found.end(); ++it) { 
    cv::Rect r = *it; 
    // 描画に際して,検出矩形を若干小さくする 
    r.x += cvRound(r.width*0.1); 
    r.width = cvRound(r.width*0.8); 
    r.y += cvRound(r.height*0.07); 
    r.height = cvRound(r.height*0.8); 
    cv::rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3); 
    } 

    // 結果の描画 
    cv::namedWindow("result", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); 
    cv::imshow("result", img);  
    cv::waitKey(0); 
} 

它是一个非iOS的环境做,但是你可以简单地更换所有highgui要求 机iOS的东西。

你可以得到一个很好的形象从这里处理的OpenCV库:

http://aptogo.co.uk/2011/09/opencv-framework-for-ios/

所以你应该真正关心的代码是什么只是这一部分:

cv::HOGDescriptor hog; 
    hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); 

    std::vector<cv::Rect> found; 
    // 画像,検出結果,閾値(SVMのhyper-planeとの距離), 
    // 探索窓の移動距離(Block移動距離の倍数), 
    // 画像外にはみ出た対象を探すためのpadding, 
    // 探索窓のスケール変化係数,グルーピング係数 
    hog.detectMultiScale(img, found, 0.2, cv::Size(8,8), cv::Size(16,16), 1.05, 2); 

    std::vector<cv::Rect>::const_iterator it = found.begin(); 
    std::cout << "found:" << found.size() << std::endl; 
    for(; it!=found.end(); ++it) { 
    cv::Rect r = *it; 
    // 描画に際して,検出矩形を若干小さくする 
    r.x += cvRound(r.width*0.1); 
    r.width = cvRound(r.width*0.8); 
    r.y += cvRound(r.height*0.07); 
    r.height = cvRound(r.height*0.8); 
    cv::rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3); 
    } 

对于一个简介:

// You get your img into a cv mat from the uiimage or whatever. 

    cv::Mat gray_img; 
    cv::cvtColor(img, gray_img, CV_BGR2GRAY); 
    cv::normalize(gray_img, gray_img, 0, 255, cv::NORM_MINMAX); 

    std::vector<cv::KeyPoint> keypoints; 
    std::vector<cv::KeyPoint>::iterator itk; 
    cv::Mat descriptors; 

    // 
    // threshold=0.05, edgeThreshold=10.0 
    cv::SiftFeatureDetector detector(0.05,10.0); 
    detector.detect(gray_img, keypoints); 
    // Brief に基づくディスクリプタ抽出器 
    cv::BriefDescriptorExtractor extractor; 
    cv::Scalar color(50,50,155); 
    extractor.compute(gray_img, keypoints, descriptors); 

    // 32次元の特徴量 x keypoint数 
    for(int i=0; i<descriptors.rows; ++i) { 
    cv::Mat d(descriptors, cv::Rect(0,i,descriptors.cols,1)); 
    std::cout << i << ": " << d << std::endl; 
    } 

而你有你的结果。

+0

感谢您的回答。这对HOGDescriptor和这个功能非常有用,但是如果我想要使用功能检测,即FAST和BRIEF以及功能匹配,那么这些功能都是在features2d中。如果我不能使用features2d,那么我可能只是使用planarDetector,这非常缓慢且不准确。 – 2012-04-25 00:44:42

+0

我不明白你为什么不能使用这些,我已经在iPhone上使用简短和快速。没有必要使用highgui方便的方法,这就是为什么你无法编译它并不重要,检查答案上的编辑。 – Pochi 2012-04-25 00:56:01

+0

@JoshuaNoble使用我发布的链接。按照他们的方法作为基础,并将图像处理部分替换为您想要的任何特征检测。如果我记得我正确地使用它的ORB和图像流,但我也测试了简短和快速。 – Pochi 2012-04-25 01:01:52