以下是给定代码的详细注释:
#include "colorgroup.h"
#include <QFile>
#include <QDebug>
#include <QDir>
#include <QHostAddress>
#include <thread>
#include <QString>
#include <opencv5/opencv2/imgcodecs.hpp>
#include <opencv5/opencv2/highgui.hpp>
#include <opencv5/opencv2/core.hpp>
#include <opencv5/opencv2/opencv.hpp>
#include <QMutex>
// 定义目标IP地址和本地IP地址
#define goalIp "10.0.0.30"
#define nativeIp "10.0.0.34"
// 全局互斥锁,用于线程同步
QMutex g_mutex;
// colorGroup类的构造函数
colorGroup::colorGroup()
{
// 打开存储颜色阈值的文件
QFile file(QDir::toNativeSeparators(QDir::currentPath()+"/"+"colorGroup.txt"));
if(!file.open(QIODevice::ReadWrite|QIODevice::Text)){
qDebug() << "未能成功读取颜色阈值" << endl;
return;
} else {
qDebug() << "成功读取颜色阈值" << endl;
}
// 按行读取文件中的颜色阈值
while(!file.atEnd()){
QByteArray line = file.readLine();
QString str(line);
QStringList list = str.split(" ");
// 设置黄色阈值
if(list[0] == "yellow"){
yellowMin.val[0] = list[1].toInt();
yellowMin.val[1] = list[2].toInt();
yellowMin.val[2] = list[3].toInt();
yellowMax.val[0] = list[4].toInt();
yellowMax.val[1] = list[5].toInt();
yellowMax.val[2] = list[6].toInt();
}
// 设置蓝色阈值
else if(list[0] == "blue"){
blueMin.val[0] = list[1].toInt();
blueMin.val[1] = list[2].toInt();
blueMin.val[2] = list[3].toInt();
blueMax.val[0] = list[4].toInt();
blueMax.val[1] = list[5].toInt();
blueMax.val[2] = list[6].toInt();
}
// 设置紫色阈值
else if(list[0] == "violet"){
violetMin.val[0] = list[1].toInt();
violetMin.val[1] = list[2].toInt();
violetMin.val[2] = list[3].toInt();
violetMax.val[0] = list[4].toInt();
violetMax.val[1] = list[5].toInt();
violetMax.val[2] = list[6].toInt();
}
// 设置棕色阈值
else if(list[0] == "brown"){
brownMin.val[0] = list[1].toInt();
brownMin.val[1] = list[2].toInt();
brownMin.val[2] = list[3].toInt();
brownMax.val[0] = list[4].toInt();
brownMax.val[1] = list[5].toInt();
brownMax.val[2] = list[6].toInt();
}
// 设置绿色阈值
else if(list[0] == "green"){
greenMin.val[0] = list[1].toInt();
greenMin.val[1] = list[2].toInt();
greenMin.val[2] = list[3].toInt();
greenMax.val[0] = list[4].toInt();
greenMax.val[1] = list[5].toInt();
greenMax.val[2] = list[6].toInt();
}
// 设置红色阈值
else if(list[0] == "red"){
redMin.val[0] = list[1].toInt();
redMin.val[1] = list[2].toInt();
redMin.val[2] = list[3].toInt();
redMax.val[0] = list[4].toInt();
redMax.val[1] = list[5].toInt();
redMax.val[2] = list[6].toInt();
}
// 设置白色阈值
else if(list[0] == "white"){
whiteMin.val[0] = list[1].toInt();
whiteMin.val[1] = list[2].toInt();
whiteMin.val[2] = list[3].toInt();
whiteMax.val[0] = list[4].toInt();
whiteMax.val[1] = list[5].toInt();
whiteMax.val[2] = list[6].toInt();
}
}
// 绑定UDP套接字到本地IP地址和端口
udpsocket.bind(QHostAddress(nativeIp), 30014);
// 设置图像编码参数,压缩比率为50%
parameter.push_back(IMWRITE_JPEG_QUALITY);
parameter.push_back(50);
}
// 将当前颜色阈值保存到文件中
void colorGroup::save(){
qDebug() << "save successful" << endl;
QFile file(QDir::toNativeSeparators(QDir::currentPath()+"/"+"colorGroup.txt"));
if(!file.open(QIODevice::ReadWrite|QIODevice::Text)){
qDebug() << "未能成功写入" << endl;
return;
}
QString dataAll = "";
QString dataline = "";
// 保存黄色阈值
dataline.append("yellow ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(yellowMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(yellowMax.val[i]) + " ");
dataline.append(QString::number(yellowMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存蓝色阈值
dataline.append("blue ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(blueMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(blueMax.val[i]) + " ");
dataline.append(QString::number(blueMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存紫色阈值
dataline.append("violet ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(violetMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(violetMax.val[i]) + " ");
dataline.append(QString::number(violetMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存绿色阈值
dataline.append("green ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(greenMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(greenMax.val[i]) + " ");
dataline.append(QString::number(greenMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存棕色阈值
dataline.append("brown ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(brownMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(brownMax.val[i]) + " ");
dataline.append(QString::number(brownMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存红色阈值
dataline.append("red ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(redMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(redMax.val[i]) + " ");
dataline.append(QString::number(redMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存白色阈值
dataline.append("white ");
for(int i = 0; i <= 2; i++)
dataline.append(QString::number(whiteMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(whiteMax.val[i]) + " ");
dataline.append(QString::number(whiteMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 保存橙色阈值
dataline.append("orange ");
for(int i = 0; i <= 2; i++)
dataline.append
(QString::number(orangeMin.val[i]) + " ");
for(int i = 0; i <= 1; i++)
dataline.append(QString::number(orangeMax.val[i]) + " ");
dataline.append(QString::number(orangeMax.val[2]) + "\n");
dataAll.append(dataline);
dataline.clear();
// 将所有数据写入文件
QTextStream out(&file);
out << dataAll;
file.close();
}
// colorGroup类的析构函数
colorGroup::~colorGroup() { }
// 获取所有图像并返回它们的QList
QList<QImage> colorGroup::getAllImage() {
return this->imagelist;
}
// 设置所有图像的QList
void colorGroup::setAllImage(QList<QImage> list) {
this->imagelist = list;
}
// 发送图像数据,通过UDP套接字
void colorGroup::sendImage(QImage image) {
cv::Mat send;
cv::Mat image_cv;
QMutexLocker locker(&g_mutex);
// 将QImage转换为OpenCV的Mat格式
if (image.format() == QImage::Format_RGB888) {
image_cv = cv::Mat(image.height(), image.width(), CV_8UC3, const_cast<uchar*>(image.bits()), image.bytesPerLine());
} else if (image.format() == QImage::Format_ARGB32) {
image_cv = cv::Mat(image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine());
cv::cvtColor(image_cv, image_cv, cv::COLOR_BGRA2BGR); // 将BGRA格式转换为BGR格式
}
// 编码图像为JPEG格式
cv::imencode(".jpg", image_cv, send, parameter);
QByteArray data((const char*)send.data(), send.total() * send.elemSize());
// 使用UDP套接字发送图像数据到目标IP和端口
udpsocket.writeDatagram(data, QHostAddress(goalIp), 30013);
}
该代码文件实现了一个名为 colorGroup
的类,主要用于处理和发送图像数据。以下是代码的详细说明:
-
构造函数
colorGroup::colorGroup
:- 该函数从文件
colorGroup.txt
中读取颜色阈值,并将其存储在相应的成员变量中。 - 绑定UDP套接字到本地IP地址和端口
30014
。 - 设置图像编码参数,JPEG质量为50%。
- 该函数从文件
-
方法
colorGroup::save
:- 该方法将当前的颜色阈值保存到
colorGroup.txt
文件中。先生成字符串形式的阈值数据,然后写入文件。
- 该方法将当前的颜色阈值保存到
-
析构函数
colorGroup::~colorGroup
:- 析构函数用于清理资源,目前为空实现。
-
方法
colorGroup::getAllImage
和colorGroup::setAllImage
:- 这些方法用于获取和设置图像列表。
-
方法
colorGroup::sendImage
:- 该方法将给定的
QImage
图像转换为cv::Mat
格式,并使用JPEG编码后通过UDP套接字发送图像数据到目标IP和端口30013
。
- 该方法将给定的
总结
该代码实现了一个处理图像和颜色阈值的类,支持从文件读取和保存颜色阈值,并能够通过UDP发送图像数据。代码中使用了OpenCV进行图像处理和编码,Qt用于文件操作和网络通信。