日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

發布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【先上一張效果圖】:

?

一、原理:

其實原理很簡單:

1.手機投屏到電腦;

2.截取投屏畫面的題目部分,進行識別,得到題目和三個答案;

3.將答案按照一定的算法,進行搜索,得出推薦答案;

4.添加了一些其他輔助功能,比如:瀏覽器搜索結果展示、關鍵字高亮、瀏覽器可點擊等;?

二、二營長,把我的意大利...............代碼,呈上來,給友軍看看

1.手機投屏:

? ? 方式很多,這里只列舉幾個比較常用、且自己感覺簡單易用的:

? ? A.IOS:局域網內,可以利用iTools里的蘋果錄屏大師(airplay),進行投屏;

? ? B.安卓:利用連接線,可以用Totall Control,將安卓手機的畫面投到電腦上;而且電腦上還能直接操作手機;

? ? C.模擬器:一般都是安卓模擬器;可以自行下載并安裝;

?

2.截取畫面中的題目和答案

? ??A.先設置要截圖的區域。

? ? 我創建了一個窗體,專門用于設置截圖區域,給它取名叫:frmCutter。

? ? 原理:在主窗體打開frmCutter時,就將frmCutter全拼顯示。同時截取一張整個屏幕的圖片,把它設置成frmCutter窗體的背景圖片。

這樣就能在frmCutter上自由地設置了。

? ? 主窗體打開frmCutter窗體時:

// 新建一個和屏幕大小相同的圖片

Bitmap catchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);


// 創建一個畫板,讓我們可以在畫板上畫圖

// 這個畫板也就是和屏幕大小一樣大的圖片

// 我們可以通過Graphics這個類在這個空白圖片上畫圖

Graphics g = Graphics.FromImage(catchBmp);


// 把屏幕圖片拷貝到我們創建的空白圖片 catchBmp中

g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));


// 創建截圖窗體

frmCutter _frmCutter = new frmCutter();

_frmCutter.Tag = this;


// 指示窗體的背景圖片為屏幕圖片

_frmCutter.BackgroundImage = catchBmp;


_frmCutter.Width = Screen.AllScreens[0].Bounds.Width;

_frmCutter.Height = Screen.AllScreens[0].Bounds.Height;

DialogResult dr = _frmCutter.ShowDialog();


? 然后再frmCutter窗體中,寫入幾個事件:

//點擊鼠標右鍵時,取消設置

private void frmCutter_MouseClick(object sender, MouseEventArgs e)

{

? ? if (e.Button == MouseButtons.Right)

? ? {

? ? ? ? this.DialogResult = DialogResult.OK;

? ? ? ? this.Close();

? ? }

}


//點擊鼠標左鍵時,開始畫區域圖

private void frmCutter_MouseDown(object sender, MouseEventArgs e)

{

? ? // 鼠標左鍵按下是開始畫圖,也就是截圖

? ? if (e.Button == MouseButtons.Left)

? ? {

? ? ? ? // 如果捕捉沒有開始

? ? ? ? if (!_catchStart && !_catchFinished)

? ? ? ? {

? ? ? ? ? ? _catchStart = true;


? ? ? ? ? ? // 保存此時鼠標按下坐標

? ? ? ? ? ? Point newPoint = new Point(e.X, e.Y);


? ? ? ? ? ? _downPoint = newPoint;


? ? ? ? ? ? Tools.StartPoint = newPoint;

? ? ? ? }

? ? }

}


//鼠標移動時,根據移動的鼠標和點擊時的第一個點,繪制矩形

private void frmCutter_MouseMove(object sender, MouseEventArgs e)

{

? ? #region 確保截圖開始

? ? if (_catchStart && !_catchFinished)

? ? {

? ? ? ? // 新建一個圖片對象,讓它與屏幕圖片相同

? ? ? ? Bitmap copyBmp = (Bitmap)Tools.ScreenShots.Clone();


? ? ? ? // 獲取鼠標按下的坐標

? ? ? ? Point newPoint = new Point(_downPoint.X, _downPoint.Y);


? ? ? ? // 新建畫板和畫筆

? ? ? ? Graphics g = Graphics.FromImage(copyBmp);

? ? ? ? Pen p = new Pen(Color.Red, 1);


? ? ? ? // 獲取矩形的長寬

? ? ? ? int width = Math.Abs(e.X - _downPoint.X);

? ? ? ? int height = Math.Abs(e.Y - _downPoint.Y);

? ? ? ? if (e.X < _downPoint.X)

? ? ? ? {

? ? ? ? ? ? newPoint.X = e.X;

? ? ? ? }

? ? ? ? if (e.Y < _downPoint.Y)

? ? ? ? {

? ? ? ? ? ? newPoint.Y = e.Y;

? ? ? ? }


? ? ? ? _catchRectangle = new Rectangle(newPoint, new Size(width, height));


? ? ? ? Tools.CatchRectangle = new Rectangle(newPoint, new Size(width, height));

? ? ? ? Tools.CatchRectangleSize = new Size(width, height);



? ? ? ? // 將矩形畫在畫板上

? ? ? ? g.DrawRectangle(p, _catchRectangle);


? ? ? ? // 釋放目前的畫板

? ? ? ? g.Dispose();

? ? ? ? p.Dispose();

? ? ? ? // 從當前窗體創建新的畫板

? ? ? ? Graphics g1 = this.CreateGraphics();


? ? ? ? // 將剛才所畫的圖片畫到截圖窗體上

? ? ? ? // 為什么不直接在當前窗體畫圖呢?

? ? ? ? // 如果自己解決將矩形畫在窗體上,會造成圖片抖動并且有無數個矩形

? ? ? ? // 這樣實現也屬于二次緩沖技術

? ? ? ? g1.DrawImage(copyBmp, new Point(0, 0));

? ? ? ? g1.Dispose();

? ? ? ? // 釋放拷貝圖片,防止內存被大量消耗

? ? ? ? copyBmp.Dispose();

? ? }

? ? #endregion

}


//鼠標點擊后,彈起來時,完成矩形的繪制

private void frmCutter_MouseUp(object sender, MouseEventArgs e)

{

? ? if (e.Button == MouseButtons.Left)

? ? {

? ? ? ? // 如果截圖已經開始,鼠標左鍵彈起設置截圖完成

? ? ? ? if (_catchStart)

? ? ? ? {

? ? ? ? ? ? Tools.EndPoint = new Point(e.X, e.Y);


? ? ? ? ? ? _catchStart = false;

? ? ? ? ? ? _catchFinished = true;

? ? ? ? }

? ? }

}


//雙擊,確定當前選擇的設置

private void frmCutter_MouseDoubleClick(object sender, MouseEventArgs e)

{

? ? if (e.Button == MouseButtons.Left && _catchFinished)

? ? {

? ? ? ? if (this.Tag != null)

? ? ? ? {

? ? ? ? ? ? frmMain _frmMain = (frmMain)this.Tag;

? ? ? ? ? ? if (_frmMain != null)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //_frmMain.btnRead.Focus();

? ? ? ? ? ? ? ? _frmMain.ReadImageResult();

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? this.DialogResult = DialogResult.OK;

? ? ? ? this.Close();

? ? }

}

?B.設置好截圖區域后,每次題目出現時,變對該區域截圖:

//截取設置的區域屏幕圖片

Bitmap _screenShots = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);

// 創建一個畫板,讓我們可以在畫板上畫圖

// 這個畫板也就是和屏幕大小一樣大的圖片

// 我們可以通過Graphics這個類在這個空白圖片上畫圖

Graphics g_screenShots = Graphics.FromImage(_screenShots);

// 把屏幕圖片拷貝到我們創建的空白圖片 CatchBmp中

g_screenShots.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width,?

  Screen.AllScreens[0].Bounds.Height));


//剪切的圖片

_catchBmp = new Bitmap(Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height);

Graphics g = Graphics.FromImage(_catchBmp);

g.DrawImage(_screenShots, new Rectangle(0, 0, Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height),?

  Tools.CatchRectangle, GraphicsUnit.Pixel);

g.Dispose();

g_screenShots.Dispose();


//顯示圖像

this.imgCut.BackgroundImage = (Image)_catchBmp;


C.將截到的問題和答案圖片,用OCR識別

? ? 比如,我現在設置并截取到了這張圖片:

? ??

? ? 識別圖片中的文字,OCR軟件和API也不少。以前我用的谷歌tesseract4.0,安裝在本機的,沒做詞庫,識別率一般。后來發現百度OCR每天免費調用500次,果斷轉場!事實證明,正確率還是高很多。

?

? ??D.得到識別結果,將識別結果處理后,進行百度搜索:

? ? 創建了一個試題實體,后面用起來就方便了:

/// <summary>

/// 試題類

/// </summary>

public class QuestionModel

{

? ? /// <summary>

? ? /// 問題

? ? /// </summary>

? ? public string Question { get; set; }


? ? /// <summary>

? ? /// 答案1

? ? /// </summary>

? ? public string Answer1 { get; set; }


? ? /// <summary>

? ? /// 答案2

? ? /// </summary>

? ? public string Answer2 { get; set; }


? ? /// <summary>

? ? /// 答案3

? ? /// </summary>

? ? public string Answer3 { get; set; }

}

??E.百度搜索,并顯示參考答案:

? ??a).算法搜索:

? ? 1.用題目去百度搜索。在搜索的結果中,查詢答案出現的次數。

? ? 2.用題目+答案去搜索。得到每個組合的百度結果個數。

? ? 然后將上述兩種方法,根據權重權衡,用戶可以自行決定偏向于哪種結果。

? ??b).輔助搜索:

? ? 右邊還放了一個瀏覽器,可以在得到識別結果的第一時間,呈現出根據題目搜索百度的結果;并且在里面高亮顯示3個答案關鍵字。

?

三、坐等吃雞!

? ? 自動截圖、自動識別、自動搜索、自動給出參考答案、自動展現出搜索頁面并高亮顯示關鍵字……

? ? 多了一系列的輔助功能,想不吃雞都難啊~

原文地址:https://www.cnblogs.com/donkeysmall/p/8319792.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。