检测图像中对象的位置
Detect location(s) of objects in an image
我有一个看起来像这样的输入图像:
请注意,有 6 个带有黑色边框的框。我需要检测每个盒子的位置(左上角)。通常我会使用类似 template matching 的东西,但每个框的内容(黑色边框内的彩色区域)是不同的。
是否有版本的模板匹配可以配置为忽略每个框的内部区域?算法是否更适合这种情况?
另请注意,我必须处理多种不同的分辨率...因此框的实际大小会因图像而异。也就是说,比例(长宽比)将始终相同。
真实世界 example/input 每个请求的图像:
您可以找到连接组件的边界框。
要找到可以转换为灰度的连通分量,并保留所有像素值为 0,即矩形的黑色边框。
然后你可以找到每个连接组件的轮廓,并计算它的边界框。这里找到红色边界框:
代码:
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// Load the image, as BGR
Mat3b img = imread("path_to_image");
// Convert to gray scale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// Get binary mask
Mat1b binary = (gray == 0);
// Find contours of connected components
vector<vector<Point>> contours;
findContours(binary.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// For each contour
for (int i = 0; i < contours.size(); ++i)
{
// Get the bounding box
Rect box = boundingRect(contours[i]);
// Draw the box on the original image in red
rectangle(img, box, Scalar(0, 0, 255), 5);
}
// Show result
imshow("Result", img);
waitKey();
return 0;
}
根据聊天中发布的图像,此代码生成:
一般来说,此代码会正确检测卡片和噪音。你只需要根据一些标准去除噪音。其中包括:框的大小或纵横比、框内的颜色、一些纹理信息。
我有一个看起来像这样的输入图像:
请注意,有 6 个带有黑色边框的框。我需要检测每个盒子的位置(左上角)。通常我会使用类似 template matching 的东西,但每个框的内容(黑色边框内的彩色区域)是不同的。
是否有版本的模板匹配可以配置为忽略每个框的内部区域?算法是否更适合这种情况?
另请注意,我必须处理多种不同的分辨率...因此框的实际大小会因图像而异。也就是说,比例(长宽比)将始终相同。
真实世界 example/input 每个请求的图像:
您可以找到连接组件的边界框。
要找到可以转换为灰度的连通分量,并保留所有像素值为 0,即矩形的黑色边框。
然后你可以找到每个连接组件的轮廓,并计算它的边界框。这里找到红色边界框:
代码:
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// Load the image, as BGR
Mat3b img = imread("path_to_image");
// Convert to gray scale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// Get binary mask
Mat1b binary = (gray == 0);
// Find contours of connected components
vector<vector<Point>> contours;
findContours(binary.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// For each contour
for (int i = 0; i < contours.size(); ++i)
{
// Get the bounding box
Rect box = boundingRect(contours[i]);
// Draw the box on the original image in red
rectangle(img, box, Scalar(0, 0, 255), 5);
}
// Show result
imshow("Result", img);
waitKey();
return 0;
}
根据聊天中发布的图像,此代码生成:
一般来说,此代码会正确检测卡片和噪音。你只需要根据一些标准去除噪音。其中包括:框的大小或纵横比、框内的颜色、一些纹理信息。