gpt4 book ai didi

java - 找到第一个红色像素并裁剪图片

转载 作者:行者123 更新时间:2023-12-01 17:47:22 25 4
gpt4 key购买 nike

我想用 OpenCV 找到第一个红色像素并剪切其右侧图片的其余部分。

此时我编写了这段代码,但它运行速度非常慢:

        int firstRedPixel = mat.Cols();
int len = 0;


for (int x = 0; x < mat.Rows(); x++)
{
for (int y = 0; y < mat.Cols(); y++)
{
double[] rgb = mat.Get(x, y);
double r = rgb[0];
double g = rgb[1];
double b = rgb[2];

if ((r > 175) && (r > 2 * g) && (r > 2 * b))
{
if (len == 3)
{
firstRedPixel = y - len;
break;
}

len++;
}
else
{
len = 0;
}
}
}

有什么解决办法吗?

enter image description here

最佳答案

你可以:

1) 找到红色像素(参见here)

enter image description here

2)获取红色像素的边界框

enter image description here

3)裁剪图像

enter image description here

代码是用 C++ 编写的,但它只是 OpenCV 函数,因此移植到 Java 应该不难:

#include <opencv2\opencv.hpp>

int main()
{
cv::Mat3b img = cv::imread("path/to/img");

// Find red pixels
// https://stackoverflow.com/a/32523532/5008845
cv::Mat3b bgr_inv = ~img;
cv::Mat3b hsv_inv;
cv::cvtColor(bgr_inv, hsv_inv, cv::COLOR_BGR2HSV);

cv::Mat1b red_mask;
inRange(hsv_inv, cv::Scalar(90 - 10, 70, 50), cv::Scalar(90 + 10, 255, 255), red_mask); // Cyan is 90

// Get the rect
std::vector<cv::Point> red_points;
cv::findNonZero(red_mask, red_points);

cv::Rect red_area = cv::boundingRect(red_points);

// Show green rectangle on red area
cv::Mat3b out = img.clone();
cv::rectangle(out, red_area, cv::Scalar(0, 255, 0));

// Define the non red area
cv::Rect not_red_area;
not_red_area.x = 0;
not_red_area.y = 0;
not_red_area.width = red_area.x - 1;
not_red_area.height = img.rows;

// Crop away red area
cv::Mat3b result = img(not_red_area);

return 0;
}

关于java - 找到第一个红色像素并裁剪图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638822/

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