作为某种“假日项目”,我正在玩OpenCV并想要检测和测量内容。
当前工作流程(早期阶段 - 检测):
我的结果有点蹩脚,我不确定什么是正确的方向。我已经让cvBlob在我目前的设置下工作(OSX 10.7.2,Xcode 4.2.1)它是一个更好的方法吗?如果是这样,我该如何以正确的方式实施呢?
或者我是否需要先减去背景?我尝试过,但之后无法找到轮廓
这是我的形象:
这是我的输出,当我将轮廓绘制回第一张图像时:
更新
我在我的程序中使用它,我的输出看起来有点不同......
- (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;
}
答案 0 :(得分:10)
这可能是一种黑客行为,但由于这是一个“假期项目”,我还是会发布它:)
您是否尝试过隔离背景然后反转遮罩(这会假设任何背景都不是对象,但它可能适用于您想要的东西。)
以下是我使用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;
}
享受假期项目!看起来很有趣:)