gpt4 book ai didi

java - 红色圆圈样检测 |打开简历 | java

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:53 25 4
gpt4 key购买 nike

我正在编写一个程序,需要从这张图片中检测红色圆圈。

enter image description here

我尝试过精明的边缘检测并找到轮廓,但没有人找到这个红色的“圆圈”。我还尝试将其转换为 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;
}

结果如下:

enter image description here

关于java - 红色圆圈样检测 |打开简历 | java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44219214/

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