FindDiff_Qt找不同项目

news2024/9/23 17:14:07

文章目录

  • 项目简介
  • 源代码
    • widget.h
    • widget.cpp
    • widget.ui
    • 配置文件
      • 找不同.json

项目简介

  • 开发平台

    • win10
    • Qt6.6
    • msvc2022
  • 简介

    微信上有一些好玩的游戏, 找不同一种比较轻松有趣的游戏,也曾经在街机上被坑过N币, 玩了几次后,发现还是太难了,于是开始截屏放大,慢慢找,再然后就发展到截图发送到QQ的我的电脑里,用程序查找标记

    看效果:

    • 截屏的图

在这里插入图片描述

在这里插入图片描述

  • FindDiff_Qt Qt 版本的找不同
    • 交互性强点
    • 用 ps 2019 切片比较方便
    • 默认 qq的 “我的电脑”的目录并自动监视该目录,当有新的文件出现时,会自动加载并查找不同处,而且每次对比前会自动删除该目录下的其他jpg图片,需要注意

源代码

widget.h

#pragma once

#include <QImage>
#include <QWidget>
#include <QFileSystemWatcher>
#include "ui_widget.h"


namespace Ui {
class Widget;
}

class MWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MWidget(QWidget *parent = nullptr);
    ~MWidget();

private slots:
    void on_pushButton_start_clicked();
    bool loadImage();
    void showImages();
    void findDifferent();

    void setFrameColor(QColor color);

    void on_pushButton_color_clicked();

    void on_spinBox_valueChanged(int arg1);

    void on_horizontalSlider_valueChanged(int value);


    void on_spinBox_x1_valueChanged(int arg1);
    void on_spinBox_y1_valueChanged(int arg1);
    void on_spinBox_x2_valueChanged(int arg1);
    void on_spinBox_y2_valueChanged(int arg1);
    void on_spinBox_w_valueChanged(int arg1);
    void on_spinBox_h_valueChanged(int arg1);

    void on_comboBox_currentIndexChanged(int index);

public:
    Ui::Widget *ui;

private:

    QImage srcImg , src, dst, result;

    int   label_src1_height;
    int   label_src2_height;
    int label_result_height;

    QColor frameColor = QColor("#55ffff");
    QFileSystemWatcher fwatcher;

    QString workPath;

    // QWidget interface
protected:
    void resizeEvent(QResizeEvent *event);
};

widget.cpp

#include "widget.h"
#include "qout.h"
#include "ui_widget.h"

#include <QColorDialog>
#include <QDir>
#include <QDir>
#include <QFile>
#include <QFileSystemWatcher>
#include <QPainter>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

MWidget::MWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label_src1->setAlignment(Qt::AlignCenter);
    ui->label_src2->setAlignment(Qt::AlignCenter);
    ui->label_result->setAlignment(Qt::AlignCenter);
    ui->pushButton_start->setFocusPolicy(Qt::StrongFocus);
    ui->pushButton_start->setFocus(Qt::TabFocusReason);
    ui->pushButton_start->setAutoFillBackground(true);
    ui->pushButton_start->setAutoDefault(true);
    //    qout << focusNextChild() << focusWidget();
    //    qout << focusNextChild() << focusWidget();
    //    qout << focusNextChild() << focusWidget();

    ui->frame->setAutoFillBackground(true);
    ui->frame->setMaximumWidth(200);
    setFrameColor(frameColor);

    //    workPath = "E:/Users/Administrator/Documents/Tencent Files/273135482/FileRecv/MobileFile";


    workPath = QDir::fromNativeSeparators(ui->lineEdit->text());
    fwatcher.addPath(workPath);

    connect(&fwatcher, &QFileSystemWatcher::fileChanged,this,[](const QString &path){
        qout << path << "fileChanged";
    });

    connect(&fwatcher, &QFileSystemWatcher::directoryChanged,this,[this](const QString &path){
        qout << path << "directoryChanged";
        on_pushButton_start_clicked();
    });

    QFile file("D:/Project/qtdemos/32_opencv/FindDiff_Qt/找不同.json");  // 数据文件路径
    if(file.open(QFile::ReadOnly)) {
        auto byte = file.readAll();
        QJsonParseError JsonParseError ;
        QJsonDocument doc = QJsonDocument::fromJson(byte, &JsonParseError);
        if(JsonParseError.error)
            qout << JsonParseError.errorString();

        QSignalBlocker b(ui->comboBox);
        ui->comboBox->clear();
        QJsonArray docJsonArray = doc.array();

        for (int i = 0; i < docJsonArray.size(); ++i) {
            QJsonObject obj = docJsonArray.at(i).toObject();
            QString title = obj["title"].toString();
            int x1 = obj["x1"].toInt();
            int y1 = obj["y1"].toInt();
            int x2 = obj["x2"].toInt();
            int y2 = obj["y2"].toInt();
            int w  = obj["w"].toInt();
            int h  = obj["h"].toInt();
            QString itemTxt("%1:\tP1(%2,%3)\tP2(%4,%5)\t%6 x %7");
            itemTxt = itemTxt.arg(title).arg(x1).arg(y1).arg(x2).arg(y2).arg(w).arg(h);
            ui->comboBox->addItem(itemTxt);

            QVariantList list;
            list << x1 << y1 << x2 << y2 << w << h;
            ui->comboBox->setItemData(i,list);
        }
    }

    on_comboBox_currentIndexChanged(0);
}

MWidget::~MWidget()
{
    delete ui;
}

void MWidget::on_pushButton_start_clicked()
{
    auto ok = loadImage();
    if( ok )
        findDifferent();
    showImages();
}

bool MWidget::loadImage()
{

    workPath = QDir::fromNativeSeparators(ui->lineEdit->text());
    qout << workPath;
    QDir dir(workPath);
    if(!dir.exists())
        return false;

    QStringList nameFilters;
    nameFilters << "*.jpg";
    QStringList fileNames = dir.entryList(nameFilters,QDir::Files,QDir::Name);
    qout << fileNames;
    if(fileNames.isEmpty())
        return false;

    QSignalBlocker block(fwatcher);
    for (int i = 0; i < fileNames.size()-1; ++i) {
        dir.remove(fileNames.at(i));
    }


    QString imageFile( dir.absoluteFilePath(fileNames.last()) );
    srcImg.load(imageFile);

    src = srcImg.copy(ui->spinBox_x1->value(),ui->spinBox_y1->value(),
                      ui->spinBox_w ->value(),ui->spinBox_h ->value());
    dst = srcImg.copy(ui->spinBox_x2->value(),ui->spinBox_y2->value(),
                      ui->spinBox_w ->value(),ui->spinBox_h ->value());
    //    找不同
    //    src = srcImg.copy(16,294,1096,729);
    //    dst = srcImg.copy(16,1055,1096,729);
    //    小花找不同
    //    src = srcImg.copy(119,452,465,1057);
    //    dst = srcImg.copy(588,452,465,1057);
    result = dst;
    return true;
}

void MWidget::showImages()
{
    qout << "showImages";
    if(src.isNull())
        return ;
    ui->label_src1  ->setPixmap(QPixmap::fromImage(src)     .scaledToHeight(ui->label_src1  ->height()-ui->label_src1->frameWidth() * 2));
    ui->label_src2  ->setPixmap(QPixmap::fromImage(dst)     .scaledToHeight(ui->label_src2  ->height()-ui->label_src1->frameWidth() * 2));
    ui->label_result->setPixmap(QPixmap::fromImage(result)  .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}

void MWidget::findDifferent()
{
    qout << "findDifferent";
    if(src.isNull())
        return ;
    QPainter painter;
    result = src;
    result = result.convertToFormat(QImage::Format_Grayscale8);
    result = result.convertToFormat(QImage::Format_RGB32);
    painter.begin(&result);
    painter.setPen(frameColor);
    for (int i = 0; i < src.width(); ++i) {
        for (int j = 0; j < src.height(); ++j) {
            QRgb srcPix = src.pixel(i,j);
            QRgb dstPix = dst.pixel(i,j);
            if ( ( qAbs( (qRed  (srcPix)  -qRed(dstPix) ) )  > ui->spinBox->value()  // 红色
                  ||qAbs( (qGreen(srcPix)-qGreen(dstPix) ) )  > ui->spinBox->value()  // 绿色
                  ||qAbs( (qBlue (srcPix)-qBlue (dstPix) ) )  > ui->spinBox->value() ) // 蓝色
                )
            {
                painter.drawPoint(i,j);
            }
        }
    }
    painter.end();
}

void MWidget::setFrameColor(QColor color)
{
    auto frame = ui->frame;
    QPalette p = frame->palette();
    p.setBrush( QPalette::Window, color);
    frame->setPalette(p);

}

void MWidget::resizeEvent(QResizeEvent */*event*/)
{
    if(src.isNull())
        return;
    showImages();
}


void MWidget::on_pushButton_color_clicked()
{
    auto color = QColorDialog::getColor(QColor(85,255,255));
    frameColor = color;
    setFrameColor(color);
    if(src.isNull()) return;
    findDifferent();
    ui->label_result->setPixmap(QPixmap::fromImage(result)  .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}


void MWidget::on_spinBox_valueChanged(int arg1)
{
    ui->horizontalSlider->setValue(arg1);
}


void MWidget::on_horizontalSlider_valueChanged(int value)
{
    ui->spinBox->setValue(value);
    findDifferent();
    ui->label_result->setPixmap(QPixmap::fromImage(result)  .scaledToHeight(ui->label_result->height()-ui->label_src1->frameWidth() * 2));
}


void MWidget::on_spinBox_x1_valueChanged(int arg1)
{
    on_pushButton_start_clicked();

}
void MWidget::on_spinBox_x2_valueChanged(int arg1)
{
    on_pushButton_start_clicked();
}
void MWidget::on_spinBox_y1_valueChanged(int arg1)
{
    on_pushButton_start_clicked();
}
void MWidget::on_spinBox_y2_valueChanged(int arg1)
{
    on_pushButton_start_clicked();
}
void MWidget::on_spinBox_w_valueChanged(int arg1)
{
    on_pushButton_start_clicked();
}
void MWidget::on_spinBox_h_valueChanged(int arg1)
{
    on_pushButton_start_clicked();
}


void MWidget::on_comboBox_currentIndexChanged(int index)
{
    auto vars = ui->comboBox->itemData(index).value<QVariantList>();
    qout << "=======" << index << vars;
    QSignalBlocker x1( ui->spinBox_x1 );
    QSignalBlocker y1( ui->spinBox_y1 );
    QSignalBlocker x2( ui->spinBox_x2 );
    QSignalBlocker y2( ui->spinBox_y2 );
    QSignalBlocker w ( ui->spinBox_w  );
    QSignalBlocker h ( ui->spinBox_h  );
    ui->spinBox_x1->setValue(vars.at(0).toInt());
    ui->spinBox_y1->setValue(vars.at(1).toInt());
    ui->spinBox_x2->setValue(vars.at(2).toInt());
    ui->spinBox_y2->setValue(vars.at(3).toInt());
    ui->spinBox_w ->setValue(vars.at(4).toInt());
    ui->spinBox_h ->setValue(vars.at(5).toInt());
}

widget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>873</width>
    <height>672</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>0</width>
    <height>300</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout_3">
   <item row="0" column="0">
    <widget class="QLabel" name="label_src1">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="minimumSize">
      <size>
       <width>400</width>
       <height>300</height>
      </size>
     </property>
     <property name="frameShape">
      <enum>QFrame::Box</enum>
     </property>
     <property name="text">
      <string/>
     </property>
     <property name="buddy">
      <cstring>bottomright</cstring>
     </property>
    </widget>
   </item>
   <item row="0" column="1">
    <widget class="QLabel" name="label_result">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="minimumSize">
      <size>
       <width>400</width>
       <height>300</height>
      </size>
     </property>
     <property name="frameShape">
      <enum>QFrame::Box</enum>
     </property>
     <property name="text">
      <string/>
     </property>
    </widget>
   </item>
   <item row="1" column="0">
    <widget class="QLabel" name="label_src2">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="minimumSize">
      <size>
       <width>400</width>
       <height>300</height>
      </size>
     </property>
     <property name="frameShape">
      <enum>QFrame::Box</enum>
     </property>
     <property name="text">
      <string/>
     </property>
    </widget>
   </item>
   <item row="1" column="1">
    <widget class="QFrame" name="bottomright">
     <property name="minimumSize">
      <size>
       <width>400</width>
       <height>300</height>
      </size>
     </property>
     <property name="frameShape">
      <enum>QFrame::Box</enum>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <widget class="QWidget" name="widget_2" native="true">
        <layout class="QGridLayout" name="gridLayout_2">
         <item row="0" column="0" colspan="4">
          <widget class="QComboBox" name="comboBox">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <item>
            <property name="text">
             <string>找不同             p1(16,293)   p2(16,1055)  1096 x 729</string>
            </property>
           </item>
           <item>
            <property name="text">
             <string>小花找不同      p1(119,452) p2(588,452)   465 x 1057</string>
            </property>
           </item>
          </widget>
         </item>
         <item row="1" column="0">
          <widget class="QLabel" name="label">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>x1</string>
           </property>
          </widget>
         </item>
         <item row="1" column="1">
          <widget class="QSpinBox" name="spinBox_x1">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>119</number>
           </property>
          </widget>
         </item>
         <item row="1" column="2">
          <widget class="QLabel" name="label_7">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>x2</string>
           </property>
          </widget>
         </item>
         <item row="1" column="3">
          <widget class="QSpinBox" name="spinBox_x2">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>588</number>
           </property>
          </widget>
         </item>
         <item row="2" column="0">
          <widget class="QLabel" name="label_2">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>y1</string>
           </property>
          </widget>
         </item>
         <item row="2" column="1">
          <widget class="QSpinBox" name="spinBox_y1">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>452</number>
           </property>
          </widget>
         </item>
         <item row="2" column="2">
          <widget class="QLabel" name="label_5">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>y2</string>
           </property>
          </widget>
         </item>
         <item row="2" column="3">
          <widget class="QSpinBox" name="spinBox_y2">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>452</number>
           </property>
          </widget>
         </item>
         <item row="3" column="0">
          <widget class="QLabel" name="label_3">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>w</string>
           </property>
          </widget>
         </item>
         <item row="4" column="0">
          <widget class="QLabel" name="label_4">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="text">
            <string>h</string>
           </property>
          </widget>
         </item>
         <item row="3" column="1" colspan="3">
          <widget class="QSpinBox" name="spinBox_w">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>465</number>
           </property>
          </widget>
         </item>
         <item row="4" column="1" colspan="3">
          <widget class="QSpinBox" name="spinBox_h">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="maximum">
            <number>2000</number>
           </property>
           <property name="value">
            <number>1057</number>
           </property>
          </widget>
         </item>
        </layout>
       </widget>
      </item>
      <item>
       <widget class="QFrame" name="frame1">
        <property name="frameShape">
         <enum>QFrame::Box</enum>
        </property>
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <item>
          <widget class="QLineEdit" name="lineEdit">
           <property name="text">
            <string>D:\Users\Administrator\Documents\Tencent Files\xxx保密需要xxx\FileRecv\MobileFile</string>
           </property>
          </widget>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
            <widget class="QLabel" name="label_6">
             <property name="text">
              <string>色差</string>
             </property>
             <property name="alignment">
              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QSlider" name="horizontalSlider">
             <property name="value">
              <number>20</number>
             </property>
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QSpinBox" name="spinBox">
             <property name="maximum">
              <number>255</number>
             </property>
             <property name="value">
              <number>40</number>
             </property>
            </widget>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_3">
           <item>
            <spacer name="horizontalSpacer_2">
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
             </property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>153</width>
               <height>20</height>
              </size>
             </property>
            </spacer>
           </item>
           <item>
            <widget class="QFrame" name="frame">
             <property name="minimumSize">
              <size>
               <width>100</width>
               <height>0</height>
              </size>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QPushButton" name="pushButton_color">
             <property name="text">
              <string>颜色</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_4">
           <item>
            <spacer name="horizontalSpacer">
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
             </property>
             <property name="sizeHint" stdset="0">
              <size>
               <width>278</width>
               <height>20</height>
              </size>
             </property>
            </spacer>
           </item>
           <item>
            <widget class="QPushButton" name="pushButton_start">
             <property name="text">
              <string>开始</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
        </layout>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <tabstops>
  <tabstop>lineEdit</tabstop>
  <tabstop>horizontalSlider</tabstop>
  <tabstop>spinBox</tabstop>
  <tabstop>pushButton_color</tabstop>
  <tabstop>pushButton_start</tabstop>
 </tabstops>
 <resources/>
 <connections/>
</ui>

配置文件

找不同.json

[
	{
		"title":"找不同",
		"x1":16,
		"y1":294,
		"x2":16,
		"y2":1055,
		"w":1096,
		"h":729
	},
	{
		"title":"小花找不同-横向",
		"x1":53,
		"y1":441,
		"x2":53,
		"y2":1107,
		"w":1020,
		"h":636
	},
	{
		"title":"小花找不同-竖向",
		"x1":119,
		"y1":452,
		"x2":588,
		"y2":452,
		"w":465,
		"h":1057
	}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023软件测试高频面试题

前言 今天&#xff0c;我们来整理与解析一些比较高频的测试行业面试题&#xff0c;大家可以通过面试题内的一些解析&#xff0c;再结合自己的真实工作经验来进行答题思路的提取、整理。 友情提示&#xff1a;硬背答案虽可&#xff0c;但容易翻车哦。 同时&#xff0c;我也准备…

【蓝桥杯选拔赛真题04】C++计算24数字游戏 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++计算24数字游戏 一、题目要求 1、编程实现 2、输入输出 二、算法分析

7、电路综合-基于简化实频的SRFT微带线巴特沃兹低通滤波器设计

7、电路综合-基于简化实频的SRFT微带线巴特沃兹低通滤波器设计 5、电路综合-超酷-基于S11参数直接综合出微带线电路图中已经介绍了如何从传输函数或S参数综合出电路图。 24、基于原型的切比雪夫低通滤波器设计理论&#xff08;插入损耗法&#xff09;中介绍了使用集总参数元件…

基于SSM的航班订票管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

PyTorch中grid_sample的使用方法

官方文档首先Pytorch中grid_sample函数的接口声明如下&#xff1a; torch.nn.functional.grid_sample(input, grid, modebilinear, padding_modezeros, align_cornersNone)input : 输入tensor&#xff0c; shape为 [N, C, H_in, W_in]grid: 一个field flow&#xff0c; shape为…

PS 安装教程 2022版(全网最详细图文教程)

目录 一.简介 二.安装步骤 软件&#xff1a;PS版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;2.83G安装环境&#xff1a;Win10&#xff08;1903&#xff09;及以上版本&#xff0c;64位操作系统硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff0c;不支…

【Unity小技巧】如何在 Unity 中使用我们的Cinemachine虚拟相机跟踪多个目标

文章目录 每篇一句前言安装虚拟相机跟随多个目标和间隙占比代码控制添加主角目标代码控制添加敌人目标扩展代码如何实现虚拟相机跟随玩家呢&#xff1f;我们来实现一下修改虚拟相机的视野修改虚拟相机的位置和角度 推荐完结 每篇一句 岂不闻天无绝人之路&#xff0c;只要我想走…

变压器分析

参考方向 如图所示&#xff0c;是变压器的原理图。其中&#xff0c; ϕ \phi ϕ是变压器铁芯的有效磁通&#xff0c; ϕ 1 \phi_1 ϕ1​是主线圈的漏磁通&#xff0c; ϕ 2 \phi_2 ϕ2​是副线圈的漏磁通。图中 u 1 u_1 u1​为初级线圈输入电压&#xff0c; i 1 i_1 i1​为初级…

iOS Autolayout 约束设置【顺序】的重要性!

0x00 顺序不同&#xff0c;结果不同 看图说话 1 代码是这样滴~ 设置好约束&#xff0c;让 4 个按钮&#xff0c;宽度均分~ 结果如上图 [_pastButton.topAnchor constraintEqualToAnchor:_textView.bottomAnchor constant:6].active YES;[_pastButton.leftAnchor constraintEq…

电子学会C/C++编程等级考试2023年05月(四级)真题解析

C/C等级考试&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。而他最为突出的地方&#xff0c;就是他每次都能逃脱中村警部的重重围堵&#xff0c;而这也很大程度…

云原生安全:如何保护云上应用不受攻击

文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码&#xff1a; 2. 数据加密示例代…

Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh

时间序列分析在金融和医疗保健等领域至关重要&#xff0c;在这些领域&#xff0c;理解随时间变化的数据模式至关重要。在本文中&#xff0c;我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目&#xff0c;有n个数&#xff0c;取值范围是 0~n&#xff0c;写出一个排序算法&#xff0c;要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果&#xff0c;这一篇将会介绍一种不基于比较的排序方法。这…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

Java JSON字符串转换成JSON对象

方法一&#xff1a;要先转为LinkedHashMap&#xff0c;再转json&#xff08;推荐&#xff0c;我使用这种方法&#xff09; String jsonStr"{\"id\":\"10001\",\"name\":\"肉类\",\"menus\":[{\"name\":\&qu…

Node切换版本

以非安转版本方式安装Node&#xff0c;经常会需要进行Node的版本切换。 官方的做法是&#xff1a;nvm use version。 但是这种方法经常会失败。如下&#xff1a; 其实nvm命令的本质就是给当前node版本添加一个快捷方式&#xff08;或软连接&#xff09;&#xff0c;因为环境变…

AT800(3000) +昇腾300V 之一 环境部署

环境部署 背景服务器 硬件资源系统&#xff1a;CPU&#xff1a;NPU&#xff1a;固件与驱动CANN 背景 因nvidia 受限 公司转华为推理服务器 AT800&#xff08;3000&#xff09; 昇腾 &#xff0c;将推出一系列文章 &#xff0c;记录过程。 服务器 硬件资源 系统&#xff1a;…

再畅通工程(最小生成树)

题目描述&#xff1a;还是畅通工程 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&…

轻量封装WebGPU渲染系统示例<6>-混合模式(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/BlendTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户…