2011-12-21 64 views
12

作为某种“度假项目”,我在玩OpenCV并希望检测和测量内容。OpenCV C++/Obj-C:适当的对象检测

当前工作流(早期 - 检测):

  1. 转换为灰度(CV :: cvtColor)
  2. 应用自适应阈值(CV :: adaptiveThreshold)
  3. 应用Canny边缘检测(CV: :康力)
  4. 寻找轮廓(CV :: findContours)

我的结果是有点蹩脚,我不知道什么是右击t方向走。我已经有cvBlob在我当前的设置下工作(OSX 10.7.2,Xcode 4.2.1)是否更好?如果是这样,我该如何正确实施?

或者我需要先扣除背景吗?我试过,但没能找到轮廓之后

这里是我的形象: image to measure

这就是我的输出,当我画我的等值线回到第一个图像: output

UPDATE

我得到了它在我的工作PROGRAMM和我的输出看起来有点不同......

- (IBAction)processImage:(id)sender 
{ 
    cv::Mat forground = [[_inputView image] CVMat]; 
    cv::Mat result = [self isolateBackground:forground]; 
    [_outputView setImage:[NSImage imageWithCVMat:result]]; 
} 

- (cv::Mat)isolateBackground:(cv::Mat &)_image 
{ 
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0; 
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL); 
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)); 
    cv::Mat bgIsolation; 
    cv::inRange(_image, cv::Scalar(bl, gl, rl), cv::Scalar(bh, gh, rh), bgIsolation); 
    bitwise_not(bgIsolation, bgIsolation); 
    erode(bgIsolation, bgIsolation, cv::Mat()); 
    dilate(bgIsolation, bgIsolation, element); 
    return bgIsolation; 
} 

回答

10

这可能是一种黑客攻击的,但因为它是一个“假期计划”,无论如何,我会张贴:)

您是否尝试过隔离的背景,然后反向掩码(这会承担什么也没背景是一个对象,但它可能适用于你想要的)。

下面是我使用了OpenCV的inRange功能结果: enter image description here

你可能想用GuassianBlur平滑图像(预处理)摆脱一些锯齿的。我使用了比侵蚀内核更大的扩张内核(5x5与3x3)来摆脱一些噪点。平滑可能有助于调整阈值,从而避免侵蚀。但是,这应该让你开始。

最后,这里是我的小巧的代码片段我曾经找到这个范围:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <vector> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    Mat src = imread("test.jpg"); 


    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0; 

    string windowName = "background"; 
    namedWindow(windowName); 

    createTrackbar("rh", windowName, &rh, 255); 
    createTrackbar("rl", windowName, &rl, 255); 
    createTrackbar("gh", windowName, &gh, 255); 
    createTrackbar("gl", windowName, &gl, 255); 
    createTrackbar("bh", windowName, &bh, 255); 
    createTrackbar("bl", windowName, &bl, 255); 

    // for dilation 
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); 

    Mat bgIsolation; 
    int key = 0; 
    do 
    { 
     inRange(src, Scalar(bl, gl, rl), Scalar(bh, gh, rh), bgIsolation); 

     bitwise_not(bgIsolation, bgIsolation); 

     erode(bgIsolation, bgIsolation, Mat()); 
     dilate(bgIsolation, bgIsolation, element); 

     imshow(windowName, bgIsolation); 
     key = waitKey(33); 
    } while((char)key != 27); 

    waitKey(); 

    return 0; 
} 

享受假期的项目!看起来很有趣:)

+0

非常感谢!你可以看看我的代码吗? – dom 2011-12-22 09:10:12

+0

@moosgummi你得到不同输出的原因是因为你正在转换到HSV色彩空间。我的门槛是RGB空间。您可以使用HSV,但您需要为该空间找到适当的范围。您可以将该颜色转换添加到我的示例应用程序中,然后尝试一下。我想你只需要担心色调和饱和度通道,因为值通道不包含任何颜色信息(即,值范围将保持不变[0,255])。希望有所帮助! – mevatron 2011-12-22 14:50:15

+0

好的,所以它应该在RGB中更好地工作?bl,gl和rl是蓝色,绿色和红色值。我对吗? – dom 2011-12-22 15:18:14