Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找到第一个红色像素并裁剪图片_Java_C#_Opencv_Graphics_Tesseract - Fatal编程技术网

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

Java 找到第一个红色像素并裁剪图片,java,c#,opencv,graphics,tesseract,Java,C#,Opencv,Graphics,Tesseract,我想用OpenCV找到第一个红色像素,并在其右侧剪切图片的其余部分 目前我编写了这段代码,但它的运行速度非常慢: int firstRedPixel = mat.Cols(); int len = 0; for (int x = 0; x < mat.Rows(); x++) { for (int y = 0; y < mat.Cols(); y++)

我想用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;
                    }
                }
            }
int firstRedPixel=mat.Cols();
int len=0;
对于(int x=0;x175)和&(r>2*g)和&(r>2*b))
{
如果(len==3)
{
firstRedPixel=y-len;
打破
}
len++;
}
其他的
{
len=0;
}
}
}
有什么解决办法吗


这不是使用计算机视觉的方法。我知道这一点,因为我也是这样做的

实现目标的一种方法是使用模板匹配从图像中剪切出的红色条,从而找到红色边框并将其剪切掉

另一种方法是转移到HSV空间,过滤掉红色内容,并根据需要使用轮廓查找来定位大型红色结构


有很多方法可以做到这一点。不过,在像素值上循环很少是正确的方法,这样你就不会利用复杂的矢量化或算法。

这不是使用计算机视觉的方法。我知道这一点,因为我也是这样做的

实现目标的一种方法是使用模板匹配从图像中剪切出的红色条,从而找到红色边框并将其剪切掉

另一种方法是转移到HSV空间,过滤掉红色内容,并根据需要使用轮廓查找来定位大型红色结构

有很多方法可以做到这一点。不过,在像素值上循环很少是正确的方法,这样你就不会利用复杂的矢量化或算法。

你可以:

1) 查找红色像素(请参阅)

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

3) 裁剪你的图像

<代码> 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;
}   
#包括
int main()
{
cv::Mat3b img=cv::imread(“路径/到/img”);
//查找红色像素
// 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红色遮罩;
在范围内(hsv_inv,cv::Scalar(90-10,70,50),cv::Scalar(90+10,255,255),红色掩码);//青色是90
//得到直肠
std::矢量红色_点;
cv::findNonZero(红色屏蔽、红色点);
cv::Rect red_area=cv::boundingRect(红色_点);
//在红色区域显示绿色矩形
cv::Mat3b out=img.clone();
cv::矩形(输出,红色_区域,cv::标量(0,255,0));
//定义非红色区域
cv::矩形非红色区域;
非红色区域。x=0;
非红色区域。y=0;
非红色区域。宽度=红色区域。x-1;
非红色区域高度=img.rows;
//清除红色区域
cv::Mat3b结果=img(非红色区域);
返回0;
}   
您可以:

1) 查找红色像素(请参阅)

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

3) 裁剪你的图像

<代码> 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;
}   
#包括
int main()
{
cv::Mat3b img=cv::imread(“路径/到/img”);
//查找红色像素
// 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红色遮罩;
在范围内(hsv_inv,cv::Scalar(90-10,70,50),cv::Scalar(90+10,255,255),红色掩码);//青色是90
//得到直肠
std::矢量红色_点;
cv::findNonZero(红色屏蔽、红色点);
cv::Rect red_area=cv::boundingRect(红色_点);
//在红色区域显示绿色矩形
cv::Mat3b out=img.clone();
cv::矩形(输出,红色_区域,cv::标量(0,255,0));
//定义非红色区域
cv::矩形非红色区域;
非红色区域。x=0;
非红色区域。y=0;
非红色区域。宽度=红色区域。x-1;
非红色区域高度=img.rows;
//清除红色区域
cv::Mat3b结果=img(非红色区域);
返回0;
}   

我认为最好是对整个序列进行训练,然后通过编程方式裁剪尾部子串(3个位置)。我的意思是,你们所需要的只是识别数字和它们的顺序。我只需要识别黑色背景上的部分。我还将专注于识别数字-模板匹配在这里也会有所帮助-然后只丢失最后两个数字。我想最好只训练整个序列,然后裁剪尾部子串(3个位置)以编程方式。我的意思是,你只需要识别数字和它们的顺序。我只需要识别黑色背景上的部分。我还将重点识别数字-模板匹配在这里也会有所帮助-然后只丢失最后两位数字。以下是查找红色的一般方法:以下是查找红色的一般方法: