3

アナログメーターのメーター読み取り値を検出しようとしています。現在、Amazon認識サービスを使用して、反応ネイティブアプリでメーターから測定値を抽出しています。このプロセスはうまく機能しなかったため、これを修正する試みの一環として. アプリにクロッピング機能を実装したので、画像の関連部分のみをサービスに送信します。私は別の問題に遭遇します。メーターのアナログセパレーターは、それらが1つとして読み取られるように散在しています。

クロップされていないメーター画像 クロップされていないメーター画像

モバイルアプリから 切り抜いた画像 モバイルアプリから切り抜いた画像

私が試したこと。イメージを rekognito に送信する前に、これらの行を削除するための単純なサーバー アプリケーションを作成しました。

  • 画像をグレースケールに変換しました
  • ガウス ブラーを適用して、ノイズの一部を除去しました。
  • [キャニー アルゴリズム ( https://en.wikipedia.org/wiki/Canny_edge_detector ) を適用してエッジを検出します。

ノードにopencvを使用する

const { img } = req.params; // Mat

  const grayWithGaussianBlur = img
    .cvtColor(cv.COLOR_BGR2GRAY)
    .gaussianBlur(new cv.Size(5, 5), 0, 0, cv.BORDER_DEFAULT)
    .canny(30, 150);

結果はこんな感じ。 結果

期待通りの出来栄えです。散在するエッジを削除して、明確に定義されたエッジを残す方法を見つけようとしています。

輪郭をフィルタリングして、特定の基準を満たす輪郭のみを残しました。一定の閾値より大きい面積のように、

 const contours = grayWithGaussianBlur.copy().findContours(cv.RETR_TREE, cv.CHAIN_APPROX_NONE);

  const viable = contours.filter(contour => {
     const { width,height } = contour.boundingRect();
     return width > 5 && width <= height; // example criteria
  });

  const newImage = new cv.Mat(grayWithGaussianBlur.rows, grayWithGaussianBlur.cols, 0);

  newImage.drawContours(viable, new cv.Vec3(255, 255, 255), -1);

これを機能させることはできません。

画像処理の概念についての私の理解は非常に曖昧であり、これがこの問題を解決する良い方法であるかどうか確信が持てません。また、自分が何をしているのかについてもあまり知りません:)。

申し訳ありませんが、画像を直接埋め込むには十分な評判がありません。

誰でも行を削除するためのより良いアプローチを助けたり提案したりできますか? 前もって感謝します。

4

0 に答える 0