gpt4 book ai didi

c++ - OpenCV C++/Obj-C : Proper object detection

转载 作者:IT老高 更新时间:2023-10-28 23:19:02 26 4
gpt4 key购买 nike

作为某种“假日项目”,我正在玩弄 OpenCV,并希望检测和测量东西。

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

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

我的结果有点糟糕,我不确定正确的方向是什么。我已经让 cvBlob 在我当前的设置(OSX 10.7.2,Xcode 4.2.1)下工作,这是一个更好的方法吗?如果是这样,我怎样才能以正确的方式实现它?

还是我需要先进行背景减法?我试过了,但后来找不到轮廓

这是我的图片: image to measure

当我将轮廓绘制回第一张图像时,这就是我的输出: output

更新

我让它在我的程序中工作,我的输出看起来有点不同......

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

最佳答案

这可能是一种 hack,但由于它是一个“假期项目”,我还是会发布它:)

您是否尝试过隔离背景然后反转蒙版(这会假设任何不是背景的对象都是对象,但它可能适用于您想要的东西)。

以下是我使用 OpenCV inRange 得到的结果功能: enter image description here

您可能希望使用 GuassianBlur 平滑图像(预处理)摆脱一些锯齿状。我使用了比腐 eclipse 内核更大的膨胀内核(5x5 对 3x3)来去除一些嘈杂的像素。平滑可能有助于这也调整阈值可能使侵 eclipse 变得不必要。但是,这应该可以帮助您入门。

最后,这是我用来查找此范围的快速小代码片段:

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

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

关于c++ - OpenCV C++/Obj-C : Proper object detection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com