gpt4 book ai didi

c++ - 在 OpenCV 中使用 inRange() 检测范围内的颜色

转载 作者:太空狗 更新时间:2023-10-29 21:35:07 26 4
gpt4 key购买 nike

我正在用 OpenCV 编写一个 C++ 程序来检测月球陨石坑,它似乎只能准确检测到一小部分陨石坑。我对这种方法的策略是首先将图像转换为 HSV,然后使用 inRange() 捕捉值范围内的颜色以产生阈值,然后对其进行高斯模糊并使用 HoughCircles () 来检测圆圈。

我没有完全理解的一件事是,当我给 inRange() 一个颜色周围的低阈值和高阈值时,它根本不返回任何东西。只是一个黑色的图像。它仅在我将低阈值设置为 Scalar(0,0,0) 时有效,但我认为这会使它有些不准确。有什么我不明白的吗?我的测试图片如下。

月球表面 enter image description here

这是我用来测试这张图片的代码:

#include <cstdio>
#include <iostream>

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
// using namespace cv;

printf("%s\n", argv[1]);
Mat src=imread(argv[1]);

if (!src.data) {
std::cout << "ERROR:\topening image" <<std::endl;
return -1;
}

// converts the image to hsv so that circle detection is more accurate
Mat hsv_image;
cvtColor(src, hsv_image, COLOR_BGR2HSV);
// high contrast black and white
Mat imgThreshold;
inRange(hsv_image,
Scalar(0, 0, 0),
Scalar(48, 207, 74),
imgThreshold);

// Applies a gaussian blur to the image
GaussianBlur( imgThreshold, imgThreshold, Size(9, 9), 2, 2 );
// fastNlMeansDenoisingColored(imgThreshold, imgThreshold, 10, 10, 7, 21);

vector<Vec3f> circles;
// applies a hough transform to the image
HoughCircles(imgThreshold, circles, CV_HOUGH_GRADIENT,
2, // accumulator resolution (size of image / 2)
100, //minimum dist between two circles
400, // Canny high threshold
10, // minimum number of votes
10, 65); // min and max radius

cout << circles.size() << endl;
cout << "end of test" << endl;

vector<Vec3f>::
const_iterator itc = circles.begin();
// Draws the circles on the source image
while (itc!=circles.end()) {

circle(src, // src_gray2
Point((*itc)[0], (*itc)[1]), // circle center
(*itc)[2], // circle radius
Scalar(0,0,255), // color
5); // thickness

++itc;
}
namedWindow("Threshold",CV_WINDOW_AUTOSIZE);
resize(imgThreshold, imgThreshold, Size(src.cols/2,src.rows/2) ); // resizes it so it fits on our screen
imshow("Threshold",imgThreshold); // displays the source iamge

namedWindow("HSV Color Space",CV_WINDOW_AUTOSIZE);
resize(hsv_image, hsv_image, Size(src.cols/2,src.rows/2) ); // resizes it so it fits on our screen
imshow("HSV Color Space",hsv_image); // displays the source iamge

namedWindow("Source Image",CV_WINDOW_AUTOSIZE);
resize(src, src, Size(src.cols/2,src.rows/2) ); // resizes it so it fits on our screen
imshow("Source Image",src); // displays the source iamge

waitKey(0);
return 0;
}

最佳答案

这是我的尝试:

int main(int argc, char** argv)
{
Mat src;
src = imread("craters1.jpg", 1);
cvtColor(src, hsv_image, COLOR_BGR2HSV);

Mat imgThreshold1, imgThreshold2, imgThreshold;
inRange(hsv_image,
Scalar(0, 0, 0),
Scalar(48, 207, 74),
imgThreshold1);

inRange(hsv_image,
Scalar(140, 0, 0),
Scalar(180, 207, 114),
imgThreshold2);

imgThreshold = max(imgThreshold1, imgThreshold2); // combining the two thresholds

Mat element_erode = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
Mat element_dilate = getStructuringElement(MORPH_ELLIPSE, Size(10, 10));
/// Apply the erosion and dilation operations
erode(imgThreshold, imgThreshold, element_erode);
dilate(imgThreshold, imgThreshold, element_dilate);

GaussianBlur(imgThreshold, imgThreshold, Size(9, 9), 2, 2);

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Find contours
findContours(imgThreshold, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

for (int i = 0; i < contours.size(); i++)
{
drawContours(src, contours, i, Scalar(0,0,255), 2, 8, hierarchy, 0, Point());
}

namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", imgThreshold);
imshow("Final result", src);

waitKey(0);

return 0;
}

与您的代码的主要区别是我不使用 HoughCircles。我不确定它会产生好的结果,因为陨石坑没有完美的圆形。相反,我使用 findContours 来圈出陨石坑。这是我得到的结果: crater detection result希望对您有所帮助!

关于c++ - 在 OpenCV 中使用 inRange() 检测范围内的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981903/

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