なぜコードが応答しなくなったのか、それを修正する方法についてのアドバイスをしたいと思います。Accord.NET 2つの画像を比較して類似性を判断する
私はAccord.NETを使用して画像を比較しています。私のプロジェクトの第1段階は、2つの画像、観察された画像とモデル画像を比較し、どれほど似ているかを判断することです。第2の方法は、観察された画像をデータベース全体と比較して、モデルがどのように分類されたかに基づいて観察された画像が最も可能性が高いかを判断することです。今は最初のものに集中しています。私は最初にExhaustiveTemplateMatching.ProcessImage()を使ってみましたが、私の必要性に合わなかったのです。今、私はSURFを使用しています。私のコードは次のようになります:
public class ProcessImage
{
public static void Similarity(System.IO.Stream model, System.IO.Stream observed,
out float similPercent)
{
Bitmap bitModel = new Bitmap(model);
Bitmap bitObserved = new Bitmap(observed);
// For method Difference, see http://www.aforgenet.com/framework/docs/html/673023f7-799a-2ef6-7933-31ef09974dde.htm
// Inspiration for this process: https://www.youtube.com/watch?v=YHT46f2244E
// Greyscale class http://www.aforgenet.com/framework/docs/html/d7196dc6-8176-4344-a505-e7ade35c1741.htm
// Convert model and observed to greyscale
Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721);
// apply the filter to the model
Bitmap greyModel = filter.Apply(bitModel);
// Apply the filter to the observed image
Bitmap greyObserved = filter.Apply(bitObserved);
int modelPoints = 0, matchingPoints = 0;
/*
* This doesn't work. Images can have different sizes
// For an example, https://thecsharper.com/?p=94
// Match
var tm = new ExhaustiveTemplateMatching(similarityThreshold);
// Process the images
var results = tm.ProcessImage(greyModel, greyObserved);
*/
using (SpeededUpRobustFeaturesDetector detector = new SpeededUpRobustFeaturesDetector())
{
List<SpeededUpRobustFeaturePoint> surfModel = detector.ProcessImage(greyModel);
modelPoints = surfModel.Count();
List<SpeededUpRobustFeaturePoint> surfObserved = detector.ProcessImage(greyObserved);
KNearestNeighborMatching matcher = new KNearestNeighborMatching(5);
var results = matcher.Match(surfModel, surfObserved);
matchingPoints = results.Length;
}
// Determine if they represent the same points
// Obtain the pairs of associated points, we determine the homography matching all these pairs
// Compare the results, 0 indicates no match so return false
if (matchingPoints <= 0)
{
similPercent = 0.0f;
}
similPercent = (matchingPoints * 100)/modelPoints;
}
}
これまでのところ、私はポイントのリストを取得することができますが、コードの一致が応答しなくなったようです。
ユーザーがビットマップを投稿した後、ASP.NET Webページから上記のコードを呼び出しています。
public ActionResult Compare(int id)
{
ViewData["SampleID"] = id;
return View();
}
[HttpPost]
public ActionResult Compare(int id, HttpPostedFileBase uploadFile)
{
Sample model = _db.Sample_Read(id);
System.IO.Stream modelStream = null;
float result = 0;
_db.Sample_Stream(model.FileId, out modelStream);
ImgProc.ProcessImage.Similarity(modelStream, uploadFile.InputStream,
out result);
ViewData["SampleID"] = id;
ViewData["match"] = result;
return View();
}
ページ自体はかなりシンプルで、非表示のフィールド、ファイルタイプの入力および送信です。
巨大な処理でアプリケーションスレッドをブロックしないように、そのプロセスを別のスレッドに起動する必要があります。 –