- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 OpenCV 编写一个 C++ 程序来检测月球陨石坑,它似乎只能准确检测到一小部分陨石坑。我对这种方法的策略是首先将图像转换为 HSV,然后使用 inRange()
捕捉值范围内的颜色以产生阈值,然后对其进行高斯模糊并使用 HoughCircles ()
来检测圆圈。
我没有完全理解的一件事是,当我给 inRange()
一个颜色周围的低阈值和高阈值时,它根本不返回任何东西。只是一个黑色的图像。它仅在我将低阈值设置为 Scalar(0,0,0)
时有效,但我认为这会使它有些不准确。有什么我不明白的吗?我的测试图片如下。
这是我用来测试这张图片的代码:
#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
来圈出陨石坑。这是我得到的结果: 希望对您有所帮助!
关于c++ - 在 OpenCV 中使用 inRange() 检测范围内的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981903/
我正在使用Opencv 3.0来仅获取图像中的彩色对象。因此,我创建并使用蒙版。 #include using namespace cv; using namespace std; int main
我似乎无法将结构上的成员值插入到 inRange 函数中。程序可以编译,但阈值并未按预期工作。如果我插入一个不是来自结构的值,它会很好地工作。 struct objects{ int iLowH
我在 Android 上使用 OpenCV 实时查找特定颜色的圆圈。我的第一步是只保留与我正在寻找的定义颜色相对应的像素(在本例中为红色或绿色)。 Example Image. 为此,我使用方法inR
如果这里遇到一个很奇怪的问题。我正在使用 Visual Studio 10 和 OpenCV 进行开发在下面的代码段中,我正在创建一个 1 channel 垫并写入两个不同的垫。第一个窗口“test1
我正在使用 java opencv,这是我正在执行的行。 Imgproc.cvtColor(originalImage, hsvImage, Imgproc.COLOR_BGR2HSV); Core.
我尝试运行以下代码: #include #include using namespace cv; int main() { VideoCapture cap; cap.open(0);
关于以下 cv2.inRange(...) 调用: mask = cv2.inRange(quantized_img, color, color) 'quantized_img' 和 'color'
我正在尝试将 cv::InRange() 与 HSV 图像一起使用。因为色调值是循环的,所以我需要处理最小/最大值,其中最小色调可能大于最大色调值。到目前为止,我使用以下代码来计算范围掩码: cv::
我正在使用 OpenCV 和 Eclipse。 我需要检测人体皮肤,所以我将图像转换为 HSV,然后使用 inRange 函数获取带有白色皮肤图像的 Mat。 问题是现在,我需要检测哪些组件是白色来修
img = cv2.imread('/home/user/Documents/workspace/ImageProcessing/img.JPG'); image = cv2.cvtColor(img
我可以使用下面的代码在框架内找到任何蓝色的东西: How To Detect Red Color In OpenCV Python? 但是我想修改代码以在我拥有的视频中查找非常特定的颜色。我从视频文件
Core.inRange(frame, new Scalar(minA,minB,minC), new Scalar(maxA,maxB,maxC), dst); 我不明白我应该向 Scalar 输入
我有我的图像mRgba,当我这样做时: Core.inRange(mRgba, B1, B2, mRgba); 我得到了预期的结果:我所有的 RGBA 图像都在 B1 和 B2 之间设置了阈值。 现在
我在转换图像以进行颜色识别时遇到了一些问题。 函数如下所示: void PaintHSVWindow(cv::Mat img){ cv::Mat HSV, threshold; cvtColor(im
我一直在尝试将 inRange 函数应用于我的图像。在没有 InRange 的情况下,到 HSV 的转换工作正常,但是当我尝试应用它时,我可以获得我想要的颜色(在本例中为紫色)。我收到错误。 我正在使
我熟悉 OpenCV 的 inRange 函数来创建掩码。假设我想获得某种颜色“周围”的颜色范围内的像素蒙版,我可以这样做: color = np.array([240, 60, 70]) max_d
我正在尝试检测对象中的白色形状,并且可以成功检测 1 个视频。 // Create and display a new matrix for triangles triangles = src.clo
我无法摆脱 OpenCV 中的这个错误: OpenCV Error: Sizes of input arguments do not match (The operation is neither '
如何更改此方法以充当 NotInRange?它应该只返回谓词与提供的 values 不匹配的项。 更新 方法名称, InRange,有点误导,应该是 WhereInRange (或类似名称) ,因为它
我正在用 OpenCV 编写一个 C++ 程序来检测月球陨石坑,它似乎只能准确检测到一小部分陨石坑。我对这种方法的策略是首先将图像转换为 HSV,然后使用 inRange() 捕捉值范围内的颜色以产生
我是一名优秀的程序员,十分优秀!