[]@TOC


前言

本文主要实现使用Qt做软甲界面,opencv做魔方识别,本软件主要是配合机械手进行通信完成魔方的识别
机器人:ABB双臂机器人


效果视频

本软件效果如下:

c++/opencv实现魔方还原

工程目录如下:

  • CtuLib:此工程包含了多个算法,包括软件加密,opencv图像处理算法,魔方还原算法等

一、算法库的构建:CtuLib.dll

本文收集了大量资料并且根据根据个人经验,实现了一个基于C++写的算法库,并且本算法库是多个命名空间,实现多个算法
CtuLib.h内容如下:

1.基于opencv实现的算法

namespace CtuLibLink
{CTULIB_API bool read_image(cv::Mat* img, std::string fileName,bool nchannels=false);CTULIB_API bool write_image(cv::Mat* img,std::string SavePath);CTULIB_API bool ConnectedCamera(int Type=0,int Num=0);CTULIB_API bool DisConnectedCamera();CTULIB_API bool CameraIsConnected();CTULIB_API bool GetOnceImage(cv::Mat* img);CTULIB_API bool DrawModelROI(cv::Mat* img, cv::Mat* model,cv::Rect* rect,int min_width=500);CTULIB_API bool DrawPoint(cv::Mat* img,cv::Rect rect,cv::Point* point,int min_width=500);CTULIB_API bool DrawSearchROI(cv::Mat* img, cv::Mat* searchROI,cv::Rect* rect,int min_width=500);CTULIB_API bool FindModel1(cv::Mat img,cv::Mat model,cv::Mat* dst,cv::Point* p);CTULIB_API bool SetCalib(double ImageX[3],double Image_Y[3],double Robot_X[3],double Robot_Y[3]);CTULIB_API bool GetP(double ImageX,double Image_Y,double* Robot_X,double* Robot_Y);CTULIB_API void Rotate_Angle(cv::Mat &src,cv::Mat &dst,float angle);
}

2.魔方还原算法

namespace MagicCubeLink
{CTULIB_API std::vector<std::string> GetCubeFunc(int data[6][9],int countNum=100000);CTULIB_API std::vector<std::string> GetCubeFlipFunc(std::vector<std::string> data);CTULIB_API std::vector<std::string> GetCubeData(int data[6][9]);CTULIB_API cv::Scalar getAvgBGR(cv::Mat img);CTULIB_API std::string isDigitStr(std::string src);
}
namespace MagicCubeFastLink
{CTULIB_API std::vector<std::string> GetCubeFunc(int data[6][9]);
}

3.软加密方式

namespace PermissionLink
{CTULIB_API bool GetData(char* uuid,int check);CTULIB_API bool AddUser(char* recv,char* Project,char* ID);CTULIB_API bool CheckUser(char* recv,char* Project,char* ID);CTULIB_API bool DeleteUser(char* recv,char* Project,char* ID);CTULIB_API bool FindAllUser(char* recv,char* Project);CTULIB_API bool GetMinWen(char* mingwen,char* miwen);CTULIB_API bool Registration(char* writemes,char* fileName);CTULIB_API bool CheckRegistration(char* fileName);
}

4.软件狗加密方式:ET99

namespace MircoDogLink
{CTULIB_API void SoftWareCheck(std::string KeyData_ID,int length,Fun pCallback);CTULIB_API void SoftWareCheck_Once(std::string KeyData_ID,int length,bool* res);CTULIB_API int WriteDog(std::string KeyData_ID,std::string miwen,bool* res);CTULIB_API void GetDogID(DWORD* data1,DWORD* data2,bool* res);
}namespace ET99DLLLink
{CTULIB_API bool SoftWareCheck(Fun pCallback);CTULIB_API void SoftWareCheck_Once(bool* res);
}

二、魔方还原

界面主要看视频即可

1.工程目录如下:

2.重要代码

1.2D

//刷新平面2D界面图
void MagicCube::Auto_Ref_2D()
{for(int i=0;i<6;i++){for(int j=0;j<9;j++){ShowLab[i][j]->setStyleSheet(SetCircleMes(Magic_Data.Magic_Data[i][j]));ShowLab[i][j]->setText(QString::number(Magic_Data.Magic_Data[i][j]));}}
}

如图:

2.3D

3D效果图主要是用opengl方式进行绘制,对27个方格进行绘制

void Model_3D_Cube::upDataColor(int data[6][9])
{//0->前   1->后   2->下   3->上     4->右    5->左//1cubeWidget->rotatecube[0]->color[0]=getColor(data[FORWARD_COLOR][6]);cubeWidget->rotatecube[0]->color[1]=getColor(0);cubeWidget->rotatecube[0]->color[2]=getColor(data[DOWN_COLOR][0]);cubeWidget->rotatecube[0]->color[3]=getColor(0);cubeWidget->rotatecube[0]->color[4]=getColor(0);cubeWidget->rotatecube[0]->color[5]=getColor(data[LEFT_COLOR][8]);//2cubeWidget->rotatecube[1]->color[0]=getColor(data[FORWARD_COLOR][7]);cubeWidget->rotatecube[1]->color[1]=getColor(0);cubeWidget->rotatecube[1]->color[2]=getColor(data[DOWN_COLOR][1]);cubeWidget->rotatecube[1]->color[3]=getColor(0);cubeWidget->rotatecube[1]->color[4]=getColor(0);cubeWidget->rotatecube[1]->color[5]=getColor(0);//3cubeWidget->rotatecube[2]->color[0]=getColor(data[FORWARD_COLOR][8]);cubeWidget->rotatecube[2]->color[1]=getColor(0);cubeWidget->rotatecube[2]->color[2]=getColor(data[DOWN_COLOR][2]);cubeWidget->rotatecube[2]->color[3]=getColor(0);cubeWidget->rotatecube[2]->color[4]=getColor(data[RIGHT_COLOR][6]);cubeWidget->rotatecube[2]->color[5]=getColor(0);//4cubeWidget->rotatecube[3]->color[0]=getColor(data[FORWARD_COLOR][3]);cubeWidget->rotatecube[3]->color[1]=getColor(0);cubeWidget->rotatecube[3]->color[2]=getColor(0);cubeWidget->rotatecube[3]->color[3]=getColor(0);cubeWidget->rotatecube[3]->color[4]=getColor(0);cubeWidget->rotatecube[3]->color[5]=getColor(data[LEFT_COLOR][5]);//5cubeWidget->rotatecube[4]->color[0]=getColor(data[FORWARD_COLOR][4]);cubeWidget->rotatecube[4]->color[1]=getColor(0);cubeWidget->rotatecube[4]->color[2]=getColor(0);cubeWidget->rotatecube[4]->color[3]=getColor(0);cubeWidget->rotatecube[4]->color[4]=getColor(0);cubeWidget->rotatecube[4]->color[5]=getColor(0);//6cubeWidget->rotatecube[5]->color[0]=getColor(data[FORWARD_COLOR][5]);cubeWidget->rotatecube[5]->color[1]=getColor(0);cubeWidget->rotatecube[5]->color[2]=getColor(0);cubeWidget->rotatecube[5]->color[3]=getColor(0);cubeWidget->rotatecube[5]->color[4]=getColor(data[RIGHT_COLOR][3]);cubeWidget->rotatecube[5]->color[5]=getColor(0);//7cubeWidget->rotatecube[6]->color[0]=getColor(data[FORWARD_COLOR][0]);cubeWidget->rotatecube[6]->color[1]=getColor(0);cubeWidget->rotatecube[6]->color[2]=getColor(0);cubeWidget->rotatecube[6]->color[3]=getColor(data[UP_COLOR][6]);cubeWidget->rotatecube[6]->color[4]=getColor(0);cubeWidget->rotatecube[6]->color[5]=getColor(data[LEFT_COLOR][2]);//8cubeWidget->rotatecube[7]->color[0]=getColor(data[FORWARD_COLOR][1]);cubeWidget->rotatecube[7]->color[1]=getColor(0);cubeWidget->rotatecube[7]->color[2]=getColor(0);cubeWidget->rotatecube[7]->color[3]=getColor(data[UP_COLOR][7]);cubeWidget->rotatecube[7]->color[4]=getColor(0);cubeWidget->rotatecube[7]->color[5]=getColor(0);//9cubeWidget->rotatecube[8]->color[0]=getColor(data[FORWARD_COLOR][2]);cubeWidget->rotatecube[8]->color[1]=getColor(0);cubeWidget->rotatecube[8]->color[2]=getColor(0);cubeWidget->rotatecube[8]->color[3]=getColor(data[UP_COLOR][8]);cubeWidget->rotatecube[8]->color[4]=getColor(data[RIGHT_COLOR][0]);cubeWidget->rotatecube[8]->color[5]=getColor(0);//10cubeWidget->othercube[0]->color[0]=getColor(0);cubeWidget->othercube[0]->color[1]=getColor(0);cubeWidget->othercube[0]->color[2]=getColor(data[DOWN_COLOR][3]);cubeWidget->othercube[0]->color[3]=getColor(0);cubeWidget->othercube[0]->color[4]=getColor(0);cubeWidget->othercube[0]->color[5]=getColor(data[LEFT_COLOR][7]);//11cubeWidget->othercube[1]->color[0]=getColor(0);cubeWidget->othercube[1]->color[1]=getColor(0);cubeWidget->othercube[1]->color[2]=getColor(data[DOWN_COLOR][4]);cubeWidget->othercube[1]->color[3]=getColor(0);cubeWidget->othercube[1]->color[4]=getColor(0);cubeWidget->othercube[1]->color[5]=getColor(0);//12cubeWidget->othercube[2]->color[0]=getColor(0);cubeWidget->othercube[2]->color[1]=getColor(0);cubeWidget->othercube[2]->color[2]=getColor(data[DOWN_COLOR][5]);cubeWidget->othercube[2]->color[3]=getColor(0);cubeWidget->othercube[2]->color[4]=getColor(data[RIGHT_COLOR][7]);cubeWidget->othercube[2]->color[5]=getColor(0);//13cubeWidget->othercube[3]->color[0]=getColor(0);cubeWidget->othercube[3]->color[1]=getColor(0);cubeWidget->othercube[3]->color[2]=getColor(0);cubeWidget->othercube[3]->color[3]=getColor(0);cubeWidget->othercube[3]->color[4]=getColor(0);cubeWidget->othercube[3]->color[5]=getColor(data[LEFT_COLOR][4]);//14cubeWidget->othercube[4]->color[0]=getColor(0);cubeWidget->othercube[4]->color[1]=getColor(0);cubeWidget->othercube[4]->color[2]=getColor(0);cubeWidget->othercube[4]->color[3]=getColor(0);cubeWidget->othercube[4]->color[4]=getColor(0);cubeWidget->othercube[4]->color[5]=getColor(0);//15cubeWidget->othercube[5]->color[0]=getColor(0);cubeWidget->othercube[5]->color[1]=getColor(0);cubeWidget->othercube[5]->color[2]=getColor(0);cubeWidget->othercube[5]->color[3]=getColor(0);cubeWidget->othercube[5]->color[4]=getColor(data[RIGHT_COLOR][4]);cubeWidget->othercube[5]->color[5]=getColor(0);//16cubeWidget->othercube[6]->color[0]=getColor(0);cubeWidget->othercube[6]->color[1]=getColor(0);cubeWidget->othercube[6]->color[2]=getColor(0);cubeWidget->othercube[6]->color[3]=getColor(data[UP_COLOR][3]);cubeWidget->othercube[6]->color[4]=getColor(0);cubeWidget->othercube[6]->color[5]=getColor(data[LEFT_COLOR][1]);//17cubeWidget->othercube[7]->color[0]=getColor(0);cubeWidget->othercube[7]->color[1]=getColor(0);cubeWidget->othercube[7]->color[2]=getColor(0);cubeWidget->othercube[7]->color[3]=getColor(data[UP_COLOR][4]);cubeWidget->othercube[7]->color[4]=getColor(0);cubeWidget->othercube[7]->color[5]=getColor(0);//18cubeWidget->othercube[8]->color[0]=getColor(0);cubeWidget->othercube[8]->color[1]=getColor(0);cubeWidget->othercube[8]->color[2]=getColor(0);cubeWidget->othercube[8]->color[3]=getColor(data[UP_COLOR][5]);cubeWidget->othercube[8]->color[4]=getColor(data[RIGHT_COLOR][1]);cubeWidget->othercube[8]->color[5]=getColor(0);//19cubeWidget->othercube[9]->color[0]=getColor(0);cubeWidget->othercube[9]->color[1]=getColor(data[BACK_COLOR][8]);cubeWidget->othercube[9]->color[2]=getColor(data[DOWN_COLOR][6]);cubeWidget->othercube[9]->color[3]=getColor(0);cubeWidget->othercube[9]->color[4]=getColor(0);cubeWidget->othercube[9]->color[5]=getColor(data[LEFT_COLOR][6]);//20cubeWidget->othercube[10]->color[0]=getColor(0);cubeWidget->othercube[10]->color[1]=getColor(data[BACK_COLOR][7]);cubeWidget->othercube[10]->color[2]=getColor(data[DOWN_COLOR][7]);cubeWidget->othercube[10]->color[3]=getColor(0);cubeWidget->othercube[10]->color[4]=getColor(0);cubeWidget->othercube[10]->color[5]=getColor(0);//21cubeWidget->othercube[11]->color[0]=getColor(0);cubeWidget->othercube[11]->color[1]=getColor(data[BACK_COLOR][6]);cubeWidget->othercube[11]->color[2]=getColor(data[DOWN_COLOR][8]);cubeWidget->othercube[11]->color[3]=getColor(0);cubeWidget->othercube[11]->color[4]=getColor(data[RIGHT_COLOR][8]);cubeWidget->othercube[11]->color[5]=getColor(0);//22cubeWidget->othercube[12]->color[0]=getColor(0);cubeWidget->othercube[12]->color[1]=getColor(data[BACK_COLOR][5]);cubeWidget->othercube[12]->color[2]=getColor(0);cubeWidget->othercube[12]->color[3]=getColor(0);cubeWidget->othercube[12]->color[4]=getColor(0);cubeWidget->othercube[12]->color[5]=getColor(data[LEFT_COLOR][3]);//23cubeWidget->othercube[13]->color[0]=getColor(0);cubeWidget->othercube[13]->color[1]=getColor(data[BACK_COLOR][4]);cubeWidget->othercube[13]->color[2]=getColor(0);cubeWidget->othercube[13]->color[3]=getColor(0);cubeWidget->othercube[13]->color[4]=getColor(0);cubeWidget->othercube[13]->color[5]=getColor(0);//24cubeWidget->othercube[14]->color[0]=getColor(0);cubeWidget->othercube[14]->color[1]=getColor(data[BACK_COLOR][3]);cubeWidget->othercube[14]->color[2]=getColor(0);cubeWidget->othercube[14]->color[3]=getColor(0);cubeWidget->othercube[14]->color[4]=getColor(data[RIGHT_COLOR][5]);cubeWidget->othercube[14]->color[5]=getColor(0);//25cubeWidget->othercube[15]->color[0]=getColor(0);cubeWidget->othercube[15]->color[1]=getColor(data[BACK_COLOR][2]);cubeWidget->othercube[15]->color[2]=getColor(0);cubeWidget->othercube[15]->color[3]=getColor(data[UP_COLOR][0]);cubeWidget->othercube[15]->color[4]=getColor(0);cubeWidget->othercube[15]->color[5]=getColor(data[LEFT_COLOR][0]);//26cubeWidget->othercube[16]->color[0]=getColor(0);cubeWidget->othercube[16]->color[1]=getColor(data[BACK_COLOR][1]);cubeWidget->othercube[16]->color[2]=getColor(0);cubeWidget->othercube[16]->color[3]=getColor(data[UP_COLOR][1]);cubeWidget->othercube[16]->color[4]=getColor(0);cubeWidget->othercube[16]->color[5]=getColor(0);//27cubeWidget->othercube[17]->color[0]=getColor(0);cubeWidget->othercube[17]->color[1]=getColor(data[BACK_COLOR][0]);cubeWidget->othercube[17]->color[2]=getColor(0);cubeWidget->othercube[17]->color[3]=getColor(data[UP_COLOR][2]);cubeWidget->othercube[17]->color[4]=getColor(data[RIGHT_COLOR][2]);cubeWidget->othercube[17]->color[5]=getColor(0);
}

如图:

3.生成队列

void MagicCube::on_pushButton_CreateData_clicked()
{ui.TabWidget_ODNGMes->clear();ui.TabWidget_ODNGMes->setRowCount(0);QStringList header;header<<QStringLiteral("ID")<<QStringLiteral("Data");ui.TabWidget_ODNGMes->setHorizontalHeaderLabels(header);for (int i=0;i<ui.TabWidget_ODNGMes->columnCount();i++)ui.TabWidget_ODNGMes->setColumnWidth(i,15);for(int i=0;i<6;i++){if(Magic_Data.Magic_Flag[i]==false){ShowMessageToLog(QStringLiteral("识别颜色不全"));return;}}int temp_Num[6]={0,0,0,0,0,0};for(int i=0;i<6;i++){for(int j=0;j<9;j++){temp_Num[Magic_Data.Magic_Data[i][j]-1]++;}}for(int i=0;i<6;i++){if(temp_Num[i]!=9){ShowMessageToLog(QStringLiteral("颜色数据错误"));return;}}Magic_Queue.clear();if(Function_Fast == 1)Magic_Queue = MagicCubeFastLink::GetCubeFunc(Magic_Data.Magic_Data);elseMagic_Queue = MagicCubeLink::GetCubeFunc(Magic_Data.Magic_Data);if(DataModel == "1")Magic_Queue = MagicCubeLink::GetCubeFlipFunc(Magic_Queue);if(Magic_Queue.size()>0){ShowMessageToLog(QStringLiteral("队列形成!"));for(int i=0;i<Magic_Queue.size();i++){try{int Num = ui.TabWidget_ODNGMes->rowCount();ui.TabWidget_ODNGMes->insertRow(Num);ui.TabWidget_ODNGMes->setItem(Num,0,new QTableWidgetItem(QString::number(Num+1)));ui.TabWidget_ODNGMes->setItem(Num,1,new QTableWidgetItem(QString::fromStdString(Magic_Queue.at(Num))));QCoreApplication::processEvents(QEventLoop::AllEvents, 5);}catch(...){}}}else{ShowMessageToLog(QStringLiteral("队列形成失败!"));}
}


三、机器人协议

DefaultSetting.ini
IP配置文件
视觉(计算机)IP:192.168.0.200,255.255.255.0;
机器人IP:192.168.0.10,255.255.255.0
Angle=1801、双击“MagiCube.exe”,点击相机,点击连接相机,ID为0,代表外部相机(###建议:重启软件时自动连接上次所选相机)
2、点击相机,开始预览
3、颜色设置,绘制搜索区域,(###建议:搜索区域重启软件应保留上次设置)
4、参数设置,点击区域划分,修改,修改颜色区域范围,保存(参数文件:color.dat)
5、测试颜色,执行识别
6、点击运行(###建议:新增功能,点击运行后,窗口按钮不可再操作)7、颜色识别(机器人触发,颜色识别程序)(###建议:机器人与视觉通讯链接已建立,机器人发:Hello Vision,视觉发:Hello Robot)
8、点击操作,数据生成(提示队列形成)(###建议:机器人发:GetData,视觉发:DataOK(队列形成),DataNG(队列形成失败)
9、点击操作,点击运行(视觉发:S,Start       返回:R,Start,OK)(###建议:机器人发:Run,视觉发:Run  OK )机器人连接成功:
视觉发:S,00机器人清空数据队列:
机器人发:R,Clear,F         返回:S,Clear,F,OK
机器人发:R,Clear,B         返回:S,Clear,B,OK
机器人发:R,Clear,L         返回:S,Clear,L,OK
机器人发:R,Clear,R         返回:S,Clear,R,OK
机器人发:R,Clear,U         返回:S,Clear,U,OK
机器人发:R,Clear,D         返回:S,Clear,D,OK
机器人发:R,Clear,A         返回:S,Clear,A,OK颜色识别程序:
机器人发:R,F      返回:S,F,OK (S,F,NG)  (前) 21        r21Move_RF_L
机器人发:R,B      返回:S,B,OK (S,B,NG) (后) 22     r22Move_RB_L
机器人发:R,L      返回:S,L,OK (S,L,NG)   (左)23      r23Move_RL_L
机器人发:R,R      返回:S,R,OK (S,R,NG) (右)24        r24Move_RR_L
机器人发:R,U      返回:S,U,OK(S,U,NG) (上)25     r25Move_RU_L
机器人发:R,D      返回:S,D,OK(S,D,NG) (下)26     r26Move_RD_L颜色识别完,机器人要求生成队列
机器人发:R,Cali     返回:S,Cali,OK (S,Cali,NG)机器人要求开始转魔方:
机器人发:R,Start    视觉返回:S,Start,OK(S,Start,NG)      机器人返回:R,Start,OK程序运行:(###建议:视觉发两步指令:第1步;第2步(第2步;第3步);S,F1,1;S,F1,1;最后1步后跟S,End0)每组数据6个字符,以“;”分隔前面F(左手)###
视觉发:S,F1,1       机器人旋转完:R,F1,1,OK(顺时针90)      31          r31S_F1_1_L
视觉发:S,F1,0       机器人旋转完:R,F1,0,OK(逆时针90)      32          r32S_F1_0_L
视觉发:S,F2,1       机器人旋转完:R,F2,1,OK(顺时针180)     33          r33S_F2_1_L后面B(右手)
视觉发:S,B1,1       机器人旋转完:R,B1,1,OK(顺时针90)      41    r41S_B1_1_R
视觉发:S,B1,0       机器人旋转完:R,B1,0,OK(逆时针90)      42    r42S_B1_0_R
视觉发:S,B2,1       机器人旋转完:R,B2,1,OK(顺时针180)    43 r43S_B2_1_R左面L(左手)###
视觉发:S,L1,1       机器人旋转完:R,L1,1,OK(顺时针90)      51    r51S_L1_1_L
视觉发:S,L1,0       机器人旋转完:R,L1,0,OK(逆时针90)      52    r52S_L1_0_L
视觉发:S,L2,1       机器人旋转完:R,L2,1,OK(顺时针180)    53 r53S_L2_1_L右面R(右手)
视觉发:S,R1,1       机器人旋转完:R,R1,1,OK(顺时针90)     61 r61S_R1_1_R
视觉发:S,R1,0       机器人旋转完:R,R1,0,OK(逆时针90)    62  r62S_R1_0_R
视觉发:S,R2,1       机器人旋转完:R,R2,1,OK(顺时针180)  63   r63S_R2_1_R上面U(左手)###
视觉发:S,U1,1       机器人旋转完:R,U1,1,OK(顺时针90)   71   r71S_U1_1_L
视觉发:S,U1,0       机器人旋转完:R,U1,0,OK(逆时针90)   72   r72S_U1_0_L
视觉发:S,U2,1       机器人旋转完:R,U2,1,OK(顺时针180) 73    r73S_U2_1_L下面D(右手)
视觉发:S,D1,1       机器人旋转完:R,D1,1,OK(顺时针90)   81   r81S_D1_1_R
视觉发:S,D1,0       机器人旋转完:R,D1,0,OK(逆时针90)   82   r82S_D1_0_R
视觉发:S,D2,1       机器人旋转完:R,D2,1,OK(顺时针180) 83    r83S_D2_1_R动作完成(代表无指令):视觉发:S,End       返回:R,End,OK

总结

感兴趣及对代码感兴趣可私聊

c++/qt/opencv实现魔方复原【机器人应用】相关推荐

  1. c++/qt/opencv实现魔方复原【娱乐】

    文章目录 前言 视频演示 一.项目工程目录 二.重要代码解析 1.Cube方块类 2.GLWidget界面构建 3.魔方还原 总结 前言 本文主要是对魔方还原进行测试,并且可通过键盘玩转魔方,然后自动 ...

  2. 如何DIY一个还原三阶魔方的机器人

    不知道用什么标题合适,想了很久也没想出一个酷炫狂拽吊炸天,低调奢华有内涵的标题,姑且就用这个吧.一直想着更新一篇博客来总结一下,可是由于前端时间学业繁重和自己的懒惰,导致拖了一两个月都没有开始,终于在 ...

  3. QT OpenCV Linux

    OpenCV with Qt OpenCV Tutorials-Installation in Linux          use this tutorial to install OpenCV i ...

  4. QT+OPENCV实现录屏功能

    本文使用QT+opencv来实现对指定窗体画面录制,并保存为avi文件. (1)获取窗体界面 QScreen类有一个grabWindow函数,可以用来获取窗体的画面,这个函数使用很简单,就是传入窗体句 ...

  5. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  6. (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述 http://www.cnblogs.com/jsxyhelu/p/7907241.html 2环境架设 http://www ...

  7. QT + OpenCV + MinGW 在windows下配置开发环境

           由于研究项目需要,最近开始接触C++界面设计,关于"QT + OpenCV + MinGW在windows下配置开发环境"着实让人头疼,单次配置时间相当长,也十分不容 ...

  8. 第一个Qt+opencv程序

    简单安装好Qt和编译安装好opencv后,简单实现第一个Qt+opencv程序:读取并显示一张图片,这里我的Qt版本时5.9.1,opencv版本是4.0.1,版本的影响不大. 首先我们用Qt创建一个 ...

  9. Qt+OpenCV打开视频文件并在窗口界面上显示

    Qt+OpenCV打开视频文件并在窗口界面上显示 1.新建一个Qt Widgets Application,工程配置文件(.pro文件)内容如下: #------------------------- ...

最新文章

  1. 据我所知,这是第一个完整实现运动分割、动态目标追踪等的「开源」动态SLAM系统!...
  2. jmeter固定定时器使用与思考
  3. qt log4qt 输出到oracle,Log4Qt 输出地
  4. java window linux_java环境变量配置(Windows Linux)
  5. android gps 串口,Android GPS数据上报(基于gps_qemu.c)
  6. 数字图像处理-0.绪论
  7. Android:ViewFlipper、幻灯片
  8. Vue+axios+Node+express实现文件上传(用户头像上传)
  9. 【渝粤教育】国家开放大学2018年春季 0605-22T中国古代文学(2) 参考试题
  10. c语言的关键字怎么编辑,C语言的关键字
  11. ExtJS教程(1)---初窥ExtJs
  12. MAC 下shell工具推荐 zentermlite
  13. 渗透测试-信息收集篇
  14. USB转串口设备如何固定串口号
  15. 【疲劳检测】基于形态学实现疲劳检测matlab源码
  16. 使用c++filt工具demangle C++符号
  17. 给图片加水印最简单的方法
  18. THREE实战2_正交投影相机与透视相机
  19. 云计算教程:小型云计算平台怎么搭建?
  20. 如何删除重复项只保留最新项

热门文章

  1. iOS JS与OC交互
  2. CCNP路由实验之八 路由重发布
  3. STK加载地图与高清影像图
  4. Spring Boot面试必问:自动配置原理
  5. react 中使用百度地图
  6. 写给毕业未5年的你和我
  7. cpufreq: cpufreq_online: Failed to initialize policy for cpu: 0 (-19)
  8. JS中JSON.parse()
  9. 【分享】beta技术沙龙:大型网站的Lucene应用
  10. 写给一个外汇女交易员的信(连载一)