簡體   English   中英

OpenCV C ++ / Obj-C:正確的對象檢測

[英]OpenCV C++/Obj-C: Proper object detection

作為某種“假期項目”,我正在玩OpenCV並想要檢測和測量內容。

當前工作流程(早期階段 - 檢測):

  1. 轉換為灰度(cv :: cvtColor)
  2. 應用自適應閾值(cv :: adaptiveThreshold)
  3. 應用canny邊緣檢測(cv :: Canny)
  4. 尋找輪廓(cv :: findContours)

我的結果有點蹩腳,我不確定什么是正確的方向。 我已經讓cvBlob在我目前的設置下工作(OSX 10.7.2,Xcode 4.2.1)它是一個更好的方法嗎? 如果是這樣,我該如何以正確的方式實施?

或者我首先需要背景扣除? 我嘗試過,但之后無法找到輪廓

這是我的形象: 圖像來衡量

這是我的輸出,當我將輪廓繪制回第一張圖像時: 產量

UPDATE

我在我的程序中工作,我的輸出看起來有點不同......

- (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;
}

這可能是一種黑客攻擊,但由於它是一個“假日項目”,我會發布它無論如何:)

您是否嘗試過隔離背景然后反轉蒙版(這會假設任何不是背景的東西都是對象,但它可能適用於您想要的東西)。

下面是我使用OpenCV inRange函數得到的結果: 在此輸入圖像描述

您可能希望使用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;
}

享受假期項目! 挺有趣的 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM