- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个程序,需要从这张图片中检测红色圆圈。
我尝试过精明的边缘检测并找到轮廓,但没有人找到这个红色的“圆圈”。我还尝试将其转换为 hsv 并通过颜色检测它,但我无法确定这种颜色的良好范围,也许背景颜色会混淆它?
我在最后一次尝试时把我的一段代码放在这里..
Mat image = new Mat();
image = Imgcodecs.imread("image.jpg");
Mat hsvImage = new Mat();
Mat grayscaleImage = new Mat();
Mat binaryImage = new Mat();
Imgproc.blur(image, image, new Size(1, 1));
Imgproc.cvtColor(image, hsvImage, Imgproc.COLOR_BGR2HSV);
Imgproc.cvtColor(image, grayscaleImage, Imgproc.COLOR_BGR2GRAY);
Imgproc.equalizeHist(grayscaleImage, grayscaleImage);
Imgproc.Canny(grayscaleImage, grayscaleImage, 50, 150, 3,false);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(grayscaleImage.clone(), contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
for (int id=0;id<contours.size();id++){
MatOfPoint2f mop2f = new MatOfPoint2f();
contours.get(id).convertTo(mop2f,CvType.CV_32F);
RotatedRect rectangle = Imgproc.minAreaRect(mop2f);
if (rectangle.boundingRect().width>80)
Imgproc.drawContours(image,contours,id,new Scalar(0,255,0));
}
最佳答案
如果你想处理那个标记的图像,你真的可能想要检测颜色。通常这是在 HSV 颜色空间中完成的。
这是一些检测“红色”颜色的 C++ 代码。结果还不足以使用 findContours,但可能经过一些扩张之后。也许您可以将代码转换为 Java。
如果您想检测不同的颜色,请将行 redMask = thresholdHue(hsv, 0, 20, 50, 50);
更改为 mask = thresholdHue(hsv, yourWantedHueColorValue, 20, 50, 50 );`
// for example to shift a circluar hue-channel
cv::Mat shiftChannel(cv::Mat H, int shift, int maxVal = 180)
{
// CV_8UC1 only!
cv::Mat shiftedH = H.clone();
//int shift = 25; // in openCV hue values go from 0 to 180 (so have to be doubled to get to 0 .. 360) because of byte range from 0 to 255
for (int j = 0; j < shiftedH.rows; ++j)
for (int i = 0; i < shiftedH.cols; ++i)
{
shiftedH.at<unsigned char>(j, i) = (shiftedH.at<unsigned char>(j, i) + shift) % maxVal;
}
return shiftedH;
}
cv::Mat thresholdHue(cv::Mat hsvImage, int hueVal, int range = 30, int minSat = 50, int minValue = 50)
{
// hsvImage must be CV_8UC3 HSV image.
// hue val and range are in openCV's hue range (0 .. 180)
// range shouldnt be bigger than 90, because that's max (all colors), after shifting the hue channel.
// this function will
// 1. shift the hue channel, so that even colors near the border (red color!) will be detectable with same code.
// 2. threshold the hue channel around the value 90 +/- range
cv::Mat mask; // return-value
std::vector<cv::Mat> channels;
cv::split(hsvImage, channels);
int targetHueVal = 180 / 2; // we'll shift the hue-space so that the target val will always be 90 afterwards, no matter which hue value was chosen. This can be important if
int shift = targetHueVal - hueVal;
if (shift < 0) shift += 180;
cv::Mat shiftedHue = shiftChannel(channels[0], shift, 180);
// merge the channels back to hsv image
std::vector<cv::Mat> newChannels;
newChannels.push_back(shiftedHue);
newChannels.push_back(channels[1]);
newChannels.push_back(channels[2]);
cv::Mat shiftedHSV;
cv::merge(newChannels, shiftedHSV);
// threshold
cv::inRange(shiftedHSV, cv::Vec3b(targetHueVal - range, minSat, minValue), cv::Vec3b(targetHueVal + range, 255, 255), mask);
return mask;
}
int main(int argc, char* argv[])
{
cv::Mat input = cv::imread("C:/StackOverflow/Input/redCircleLikeContours.jpg");
cv::Mat redMask;
cv::Mat hsv;
cv::cvtColor(input, hsv, CV_BGR2HSV);
redMask = thresholdHue(hsv, 0, 20, 50, 50);
cv::imshow("red", redMask);
cv::imshow("input", input);
cv::imwrite("C:/StackOverflow/Output/redCircleLikeContoursMask.png", redMask);
cv::waitKey(0);
return 0;
}
结果如下:
关于java - 红色圆圈样检测 |打开简历 | java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44219214/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我开始在我的图像处理程序中使用 OpenCV。当我使用 cv::Mat 并在内存方法中分配时: cv::Mat coords(100, 5, CV_32FC1); 如果我不再需要,是否需要执行 coo
hibernate :插入数据文件(file_content、file_name、doc_title、resume_text、title、title_id、file_type)值(?、?、?、?、?、
我正在尝试为求职申请制作一份简历,现在我已经使用 CSS 创建了一个背景和一个小菜单。现在我的问题: 有没有办法不使用 ,,创建一个区域,我可以在不丢失菜单的情况下将我的链接定位到该区域。 当我学习
我正在运行这段代码: #include #include #include using namespace cv; using namespace std; int main( int argc
python 3.5 和 windows 10 我使用这个命令安装了 open cv : pip install opencv_python-3.1.0-cp35-cp35m-win_amd64.wh
我在 Linux Mint 上安装了 opencv 使用: sudo apt-get install python-opencv 当我尝试使用以下方法导入 opencv 模块时: from openc
我是否可以搜索特定日期提交的 CVS 文件列表? 我目前使用 opensuse 和 cvs 命令行,还使用 Eclipse IDE 处理我的 Java 内容。 最佳答案 您可以使用 Eclipse
当我执行 rtag 时,进程相当慢,消息 cvs rtag: [07:34:59] waiting for cvsuser's lock in ...;是什么导致了这个以及如何解决这个问题?提前致谢。
我使用 OpenCV 和 MATLAB 校准了带有棋盘格图案的相机。我在 OpenCV 和 MATLAB 中分别得到了 .489 和 .187 的平均重投影误差。从它的外观来看,MATLAB 更精确。
将一个 html 页面集成到另一个 html 页面的最简单方法是什么?我在我的个人网站上工作,我有一个正在编辑的模板。现在我找到了一个可以使用的免费简历 html 代码,但是当我尝试将它添加到我的网站
在 VS2015 中构建一个简单的 OpenCV 应用程序时出现错误 'cv': a namespace with this name does not exist while building 虽然
我是一名优秀的程序员,十分优秀!