C/C++,Qt,Python,OpenCV小專案實戰-實時桌面顏色查詢

IT1995發表於2020-04-07

原始碼連線如下(含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);
}

 

相關文章