如何识别一个图片中的红色像素点并输出每个红色像素点的像素坐标用基于opencv的c++语言实现#include opencv2opencvhpp#include iostreamusing namespace cv;using namespace std;int main Mat image = imreadtestjpg; 读取图片 if imageempty
#include <opencv2/opencv.hpp>
#include
using namespace cv; using namespace std;
int main() { Mat image = imread("test.jpg"); // 读取图片 if (image.empty()) { cout << "Could not open or find the image" << endl; return -1; }
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV); // 转换为HSV颜色空间
// 定义红色范围
Scalar lower_red = Scalar(0, 100, 100);
Scalar upper_red = Scalar(10, 255, 255);
Scalar lower_red2 = Scalar(160, 100, 100);
Scalar upper_red2 = Scalar(179, 255, 255);
Mat mask1, mask2, mask;
inRange(hsv, lower_red, upper_red, mask1); // 获取红色区域掩码
inRange(hsv, lower_red2, upper_red2, mask2);
bitwise_or(mask1, mask2, mask);
vector<Point> red_pixels; // 存储红色像素点坐标
for (int i = 0; i < mask.rows; i++)
{
for (int j = 0; j < mask.cols; j++)
{
if (mask.at<uchar>(i, j) > 0) // 判断是否为红色像素点
{
red_pixels.push_back(Point(j, i)); // 存储红色像素点坐标
}
}
}
// 统计红色区块数量
vector<vector<Point>> red_blocks; // 存储红色区块
for (int i = 0; i < red_pixels.size(); i++)
{
bool found = false;
for (int j = 0; j < red_blocks.size(); j++)
{
// 判断当前像素点是否属于某个已有的红色区块
if (norm(red_pixels[i] - red_blocks[j][0]) < 50) // 假设红色区块之间的距离小于50个像素
{
red_blocks[j].push_back(red_pixels[i]);
found = true;
break;
}
}
if (!found) // 如果当前像素点不属于任何已有的红色区块,则新建一个红色区块
{
red_blocks.push_back(vector<Point>{red_pixels[i]});
}
}
// 输出每个红色区块和距离最近的红色区块之间距离的平均值
for (int i = 0; i < red_blocks.size(); i++)
{
cout << "Red block " << i + 1 << " has " << red_blocks[i].size() << " pixels" << endl;
double min_dist = DBL_MAX;
for (int j = 0; j < red_blocks.size(); j++)
{
if (i != j)
{
double dist = norm(red_blocks[i][0] - red_blocks[j][0]);
if (dist < min_dist)
{
min_dist = dist;
}
}
}
cout << "Distance to nearest red block: " << min_dist << " pixels" << endl;
}
imshow("Image", image);
imshow("Mask", mask);
waitKey(0);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/bSz2 著作权归作者所有。请勿转载和采集!