这个任务我跟着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;
}