gpt4 book ai didi

c++ - OpenCV 模板匹配相似对象

转载 作者:太空狗 更新时间:2023-10-29 21:38:41 31 4
gpt4 key购买 nike

我目前正在尝试使用 OpenCV 模板匹配功能来使用模板检测给定图像中的所有相似对象。然而,我并没有检测到所有的物体(它们是血细胞),即使它们非常相似和相同。我一直在 Internet 上搜索解决方案,但没有得到任何解决方案。

以下是我的代码:

cv::Mat ref = cv::imread("c:\\image.jpg");
cv::Mat tpl = cv::imread("c:\\template.jpg");

cv::Mat gref, gtpl;
cv::cvtColor(ref, gref, CV_BGR2GRAY);
cv::cvtColor(tpl, gtpl, CV_BGR2GRAY);

cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
cv::threshold(res, res, 0.8, 1., CV_THRESH_TOZERO);

while (true)
{
double minval, maxval, threshold = 0.8;
cv::Point minloc, maxloc;
cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

if (maxval >= threshold)
{
cv::rectangle(
ref,
maxloc,
cv::Point(maxloc.x + tpl.cols, maxloc.y + tpl.rows),
CV_RGB(0,255,0), 2
);
cv::floodFill(res, maxloc, cv::Scalar(0), 0, cv::Scalar(.1), cv::Scalar(1.));
}
else
break;
}

cv::imshow("reference", ref);

这些是使用的结果和图像:

给定图像

Given Image

模板

Template

阈值设置较高(0.8/0.8)的结果

Result

阈值设置较低的结果 (0.6/0.3)

enter image description here

我对模板匹配很陌生,有没有办法让图像中的所有对象都被检测到?

我还需要模板匹配来检测一些更复杂图像中的细胞。

enter image description here

最佳答案

在您的特定情况下,您不需要使用模板匹配。您可以只使用红色成分来检测 Blob 。如果您使用 OpenCV 3.0+,您可以使用 cv::SimpleBlobDetector .

无论如何,您可以使用cv::thresholdcv::findContours 实现简单的检测器。我尝试了以下代码:

int main()
{
const int threshVal = 30;
const int minArea = 15 * 15;
const int maxArea = 100 * 100;
cv::Mat img = cv::imread("input.jpg");

cv::Mat bgr[3];
cv::split(img, bgr);

cv::Mat red_img = bgr[2];
cv::threshold(red_img, red_img, threshVal, 255, cv::THRESH_BINARY);

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
cv::findContours(red_img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

for (int i = 0; i < contours.size(); i++)
{
int area = cv::contourArea(contours[i]);
if (area < minArea || area > maxArea)
continue;

cv::Rect roi = cv::boundingRect(contours[i]);
cv::rectangle(img, roi, cv::Scalar(0, 255, 0), 2);
}

cv::imshow("result", img);
cv::waitKey(0);
return 0;
}

此代码检测所有血细胞:

enter image description here

当然,您可能需要调整三个常量(threshValminAreamaxArea)的值以获得更好的结果 sample 。

关于c++ - OpenCV 模板匹配相似对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34690774/

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