使用opencv实现一个物体的颜色识别

文章描述了作者在Ubuntu系统中使用OpenCV进行颜色识别(红、蓝、绿)的过程中遇到的问题,程序编译无误但运行不正确,寻求帮助解决代码执行和图像处理相关问题。
摘要由CSDN通过智能技术生成

这个任务我跟着b站上的一个老师,把代码敲出来,编译也没有报错,但是程序不能运行???

(我是在ubuntu系统的工作空间src下创建一个cpp文件,会不会是这一步错了???)

Help !!!

//导入相关头文件
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include "head.h"

//蓝牙
#include <stdio.h>
#include <ubuntu.h>

#define debug(...) printf(__VA_ARGS__)

int activateSerialPort(const char *portName); //激活
int sendData(const char*data, int dataSize); //sizeof()
int receiveData(const char*data, int dataSize);
void deactivateSerialPort(); //结束,可以用if判断

//创建命名空间
using namespace cv;
using namespace std;

//创建一个识别颜色的类
class ColorFind_RGBVBBb
{
    public:
        Mat ColorFindRed(Mat srclmage);

        Mat ColorFindBule(Mat srclmage);

        Mat ColorFindGreen(Mat srclmage);
};

//创建一个判断颜色的类
class ColorBool_RGB
{
    public:
        Mat ColorFindRedBool(Mat srclmage);

        Mat ColorFindBuleBool(Mat srclmage);

        Mat ColorFindGreenBool(Mat srclmage);
};

//创建一个判断颜色的类
class ColorBool_RGB
{
    public:
        Mat ColorFindRedBool(Mat srclmage);

        Mat ColorFindBuleBool(Mat srclmage);

        Mat ColorFindGreenBool(Mat srclmage);
};

//创建一个颜色识别的关键函数
Mat ColorFind(Mat srclmage,
    int iLowH, int iHighH,
    int iLowS, int iHighS,
    int iLowV, int iHighV)
{
    Mat buflmg;
    Mat imgHSV;

    cvtColor(srclmage,imgHSV,COLOR_BGR2HSV);
    //将输入图像的BGR格式转化为HSV,方便进行后面的inRange函数参数的赋值

    inRange(imgHSV Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), buflmg);
    //inRange函数用于图像的二值化,将识别目标图像的颜色,根据其颜色HSV的色度取值范围进行二值化操作

    return buflmg;
    //返回类型为Mat型函数,其中buflmg为imHSV二值化的输出图
}

//红色识别
Mat ColorFind_RGB::ColorFindRed(Mat srclmage)
{
    Mat des1 = ColorFind(srclmage,    
        350 / 2, 360 / 2.                //调度最小值~最大值
        (int)(255 * 0.70), 255,       //饱和度最小值~最大值
        (int)(255 * 0.60), 255);      //亮度最小值~最大值

    Mat des2 = ColorFind(srclmage,    
        0.16 / 2,                            //调度最小值~最大值
        (int)(255 * 0.70), 255,       //饱和度最小值~最大值
        (int)(255 * 0.60), 255);      //亮度最小值~最大值

    Mat des_red = des1 + des2;

    return des_red;
    //返回识别到的红色的二值化图像
}

//蓝色识别
Mat ColorFind_RGB::ColorFindBule(Mat srclmage)
{
    Mat des_bule = ColorFind(srclmage,    
        210 / 2, 246 / 2.                //调度最小值~最大值
        (int)(255 * 0.60), 255,       //饱和度最小值~最大值
        (int)(255 * 0.80), 255);      //亮度最小值~最大值

    return des_blue;
    //返回识别到的蓝色的二值化图像
}

//绿色识别
Mat ColorFind_RGB::ColorFindGreen(Mat srclmage)
{
    Mat des_green = ColorFind(srclmage,    
        90  / 2, 150 / 2.                 //调度最小值~最大值
        (int)(255 * 0.46), 255,       //饱和度最小值~最大值
        (int)(255 * 0.66), 255);      //亮度最小值~最大值

    return des_green;
    //返回识别到的绿色的二值化图像
}

//红色判断
bool ColorBool_RGB::ColorFindRedBool (Mat scrlmage)
{
    Mat des1 = ColorFind(srclmage,    
        350 / 2, 360 / 2.                //调度最小值~最大值
        (int)(255 * 0.70), 255,       //饱和度最小值~最大值
        (int)(255 * 0.60), 255);      //亮度最小值~最大值

    Mat des2 = ColorFind(srclmage,    
        0.16 / 2,                            //调度最小值~最大值
        (int)(255 * 0.70), 255,       //饱和度最小值~最大值
        (int)(255 * 0.60), 255);      //亮度最小值~最大值

    Mat des_red3 = des1 + des2;

    vector<Mat> des3_;
    //创建一个Mat容器,用来储存des3_的3个通道

    split(des3,des3_); //进行通道分离

    return (countNonZero(des3_[0] == 0));
    //特别说明,countNonZero函数的参数得是单通道数组

}

//蓝色判断
bool ColorBool_RGB::ColorFindBlueBool (Mat scrlmage)
{
    Mat des_bule = ColorFind(srclmage,    
        210 / 2, 246 / 2.                //调度最小值~最大值
        (int)(255 * 0.60), 255,       //饱和度最小值~最大值
        (int)(255 * 0.80), 255);      //亮度最小值~最大值


    vector<Mat> des1_;
    //创建一个Mat容器,用来储存des3_的3个通道

    split(des_blue,des1_); //进行通道分离

    return (countNonZero(des1_[0] == 0));
    //特别说明,countNonZero函数的参数得是单通道数组

}

//绿色判断
bool ColorBool_RGB::ColorFindGreenBool (Mat scrlmage)
{
    Mat des_green = ColorFind(srclmage,    
        90  / 2, 150 / 2.                 //调度最小值~最大值
        (int)(255 * 0.46), 255,       //饱和度最小值~最大值
        (int)(255 * 0.66), 255);      //亮度最小值~最大值


    vector<Mat> des2_;
    //创建一个Mat容器,用来储存des3_的3个通道

    split(des_green,des2_); //进行通道分离

    return (countNonZero(des2_[0] == 0));
    //特别说明,countNonZero函数的参数得是单通道数组

}

int main()
{
    char data[] = "Hello world";
    activateSerialPort("COM6");

    sendData(data, sizeof(data));

    //创建对象,方便引用函数
    ColorFind_RGB find;
    ColorBool_RGB BOOL;
    
    VideoCapture cap(0);

    while( true) {

        if (waitKey(10) == 27) break;//每十毫秒读取键盘操作

        //载入色卡
        Mat frame;
        cap >> frame;

        //盒滤波
        Mat poisson;
        boxFilter(frame, poisson, -1, Size(3,3), Point(-1, -1)); //盒滤波函数

        Mat srclmage = poisson;

        imshow("原始图",srclmage);

        //绿色
        bool des_green_bool = BOOL ColorFindGreenBool(srclmage);

        Mat des_green = find.ColorFindGreen(srclmag);

        if(!des_green_bool)
        {
            cout<<"GREEN"<< endl;

            char green[] = "GRE";

            sendData(green, sizeof(green));
        }

        //蓝色
        bool des_blue_bool = BOOL ColorFindBlueBool(srclmage);

        Mat des_blue = find.ColorFindBlue(srclmag);

        if(!des_blue_bool)
        {
            cout<<"BLUE"<< endl;

            char blue[] = "BLW";

            sendData(blue, sizeof(blue));
        }
        imshow("des_blue", des_blue);

        //红色
        bool des_red_bool = BOOL ColorFindRedBool(srclmage);

        Mat des_red = find.ColorFindRed(srclmag);

        if(!des_red_bool)
        {
            cout<<"RED"<< endl;

            char red[] = "RED";

            sendData(red, sizeof(red));
        }
        imshow("des_red", des_red_1);

        waitKey(1);//(必须存在,否则视频展示不了)
    }

    cap.release(); //释放内存

    destroyALLUbuntu();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值