OPENCV C++色块识别

成功搞定了基于VS2022和opencv的色块识别代码

目前可以实现识别绿色色块并框起来和显示中心点。

 

代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 自定义比较函数,用于排序轮廓
bool compareContourArea(vector<Point> contour1, vector<Point> contour2) {
    double area1 = contourArea(contour1);
    double area2 = contourArea(contour2);
    return (area1 > area2);
}

int main() {
    // 打开摄像头
    VideoCapture cap(0);
    if (!cap.isOpened()) {
        cout << "Error: Failed to open camera." << endl;
        return -1;
    }

    while (true) {
        Mat frame;
        cap >> frame; // 从摄像头中获取一帧图像

        // 检查是否成功获取了图像
        if (frame.empty()) {
            cout << "Error: Failed to capture frame." << endl;
            break;
        }

        // 将图像转换为灰度图
        Mat gray;
        cvtColor(frame, gray, COLOR_BGR2GRAY);

        // 对灰度图进行阈值处理,分割出绿色色块
        Mat green_binary;
        inRange(frame, Scalar(0, 100, 0), Scalar(100, 255, 100), green_binary); // 绿色色块的阈值范围

        // 寻找绿色色块的轮廓
        vector<vector<Point>> green_contours;
        findContours(green_binary, green_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

        // 对轮廓按面积进行排序
        sort(green_contours.begin(), green_contours.end(), compareContourArea);

        // 仅保留最大的两个绿色色块
        vector<Point> largest_green_contour;
        if (green_contours.size() >= 1) {
            largest_green_contour = green_contours[0];
        }

        // 计算最大绿色色块的中心和坐标
        Moments green_moments = moments(largest_green_contour);
        Point green_center(green_moments.m10 / green_moments.m00, green_moments.m01 / green_moments.m00);

        // 在图像上绘制最大绿色色块的中心和坐标
        circle(frame, green_center, 5, Scalar(0, 255, 0), -1);

        // 获取最大绿色色块的边界框
        Rect green_bbox = boundingRect(largest_green_contour);

        // 在图像上框出最大绿色色块的轮廓
        rectangle(frame, green_bbox, Scalar(0, 255, 0), 2);

        // 显示处理后的图像
        imshow("Frame", frame);

        // 检查是否按下了ESC键,如果按下则退出循环
        if (waitKey(30) == 27) {
            break;
        }
    }

    // 关闭摄像头
    cap.release();
    destroyAllWindows();

    return 0;
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 OpenCV 中进行黑色色块识别,可以按照以下步骤进行: 1. 将图像转换为灰度图像:使用 OpenCV 的 cvtColor() 函数将图像从默认的 BGR 颜色空间转换为灰度图像。 ```python gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 2. 应用阈值分割:使用阈值分割方法,将灰度图像二值化。可以使用简单阈值(threshold)或自适应阈值(adaptiveThreshold)方法。对于黑色色块识别,可以使用适当的阈值将较暗的区域设为白色,其他区域设为黑色。 ```python _, binary = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY) ``` 3. 进行形态学操作(可选):根据需要,可以进行形态学操作来增强黑色色块的连通性或去除噪声。可以尝试使用腐蚀(erode)和膨胀(dilate)等操作。 ```python kernel = np.ones((kernel_size, kernel_size), np.uint8) erosion = cv2.erode(binary, kernel, iterations=1) dilation = cv2.dilate(erosion, kernel, iterations=1) ``` 4. 查找轮廓:使用 findContours() 函数查找二值图像中的轮廓。 ```python contours, _ = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ``` 5. 分析和筛选:根据您的需求,可以对轮廓进行分析和筛选。例如,可以根据轮廓的面积、周长等特征来筛选出较大的黑色色块。 ```python for contour in contours: area = cv2.contourArea(contour) if area > min_area: # 处理符合条件的黑色色块 ``` 这是一个基本的流程,具体实现还需要根据您的具体需求和图像特点进行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值