版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/83070537
源码连接如下(含Qt,VS,Python)
https://download.csdn.net/download/qq78442761/10723417
程序运行截图如下:
(原理)逻辑如下:
1.使用VS2012以及OpenCV3,编写识别颜色的算法,传入一个图像(只有一个像素(鼠标当前像素)),识别这个像素是什么颜色(识别原理在此不说,原理在这篇连接里面https://blog.csdn.net/qq78442761/article/details/83056346),把程序做成C接口的dll。
2.使用Python调用算法dll,并且接收返回过来的值
3.使用Qt截取当前鼠标的像素点,调用Python进行分析,并且获取返回值。
程序源码如下:
VS2012 OpenCV的重点代码:
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
using namespace cv;
extern "C"__declspec(dllexport) char* getColorName(char *FileName){
char *colorName;
Mat matSrc=imread(FileName,IMREAD_UNCHANGED);
Mat hsvSrc;
cvtColor(matSrc,hsvSrc,COLOR_BGR2HSV);
int HValue,SValue,VValue;
HValue=(int)hsvSrc.at<uchar>(0,0);
SValue=(int)hsvSrc.at<uchar>(0,1);
VValue=(int)hsvSrc.at<uchar>(0,2);
if((HValue>=0&&HValue<=180)
&&(SValue>=0&&SValue<=255)
&&(VValue>=0&&VValue<=46)){
colorName="黑";
}
else if((HValue>=0&&HValue<=180)
&&(SValue>=0&&SValue<=43)
&&(VValue>=46&&VValue<=220)){
colorName="灰";
}
else if((HValue>=0&&HValue<=180)
&&(SValue>=0&&SValue<=30)
&&(VValue>=221&&VValue<=255)){
colorName="白";
}
else if(((HValue>=0&&HValue<=10)||(HValue>=156&&HValue<=180))
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="红";
}
else if((HValue>=11&&HValue<=25)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="橙";
}
else if((HValue>=26&&HValue<=34)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="黄";
}
else if((HValue>=35&&HValue<=77)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="绿";
}
else if((HValue>=78&&HValue<=99)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="青";
}
else if((HValue>=100&&HValue<=124)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="蓝";
}
else if((HValue>=125&&HValue<=155)
&&(SValue>=43&&SValue<=255)
&&(VValue>=46&&VValue<=255)){
colorName="紫";
}
else{
colorName="未知";
}
return colorName;
}
胶水Python的源码:
import ctypes
import sys
if __name__=='__main__':
fileName=str(sys.argv[1])
ll=ctypes.cdll.LoadLibrary
lib =ll("judgeColor.dll")
charPointer=bytes(fileName,"gbk")
result=lib.getColorName(charPointer)
pyResult=ctypes.string_at(result);
result=pyResult.decode("gbk")
print(result)
pass
Qt源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected slots:
void printMousePoint();
protected:
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
private:
Ui::Widget *ui;
bool m_dragging;
bool m_isRunning;
QPoint m_startPosition;
QPoint m_framePosition;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QProcess>
#include <QTimer>
#include <QPixmap>
#include <QWindow>
#include <QMouseEvent>
#include <QEventLoop>
#include <QScreen>
#include <windows.h>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setMouseTracking(true);
QTimer *timer=new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(printMousePoint()));
timer->start(20);
setWindowFlags(Qt::WindowStaysOnTopHint|Qt::Window|Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
m_dragging=false;
m_isRunning=false;
}
Widget::~Widget()
{
delete ui;
}
void Widget::printMousePoint()
{
POINT p;
if(GetCursorPos(&p)&&!m_isRunning){
QWindow *window=windowHandle();
QScreen *screen=window->screen();
QPixmap pixmap=screen->grabWindow(0,(int)p.x,(int)p.y,1,1);
QString filePath=qApp->applicationDirPath()+"/1.png";
pixmap.save(filePath);
QProcess p(0);
QString cmdString="python "+qApp->applicationDirPath()+"/demo.py "+qApp->applicationDirPath()+"/1.png";
m_isRunning=true;
p.start("cmd", QStringList()<<"/c"<<cmdString);
//p.waitForStarted();
//p.waitForFinished();
QEventLoop loop;
connect(&p,SIGNAL(finished(int,QProcess::ExitStatus)),&loop,SLOT(quit()));
loop.exec();
QString strTemp=QString::fromLocal8Bit(p.readAllStandardOutput());
strTemp=strTemp.left(1);
ui->label->setText(strTemp);
m_isRunning=false;
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton){
if(m_dragging){
QPoint delta=event->globalPos()-m_startPosition;
move(m_framePosition+delta);
}
}
QWidget::mouseMoveEvent(event);
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){
m_dragging=true;
m_startPosition=event->globalPos();
m_framePosition=frameGeometry().topLeft();
}
QWidget::mousePressEvent(event);
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
m_dragging=false;
QWidget::mouseReleaseEvent(event);
}