我想找到OpenCV第一个红色像素,并在其右侧剪切其余图片。
这一刻我编写了这段代码,但它工作得非常慢:
int firstRedPixel = mat.Cols(); int len = …
这不是使用计算机视觉的方法。我知道这一点,因为我以同样的方式做到了。
实现目标的一种方法是使用模板匹配与您剪切图像的红色条,从而找到红色边框,并将其剪切掉。
另一种方法是转移到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; }