源码连接如下(含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);
- }