opencvでは、画像を処理する方法が少し異なります。いくつかの計算を行うには、より低レベルの方法で考える必要があります。低レベルでは、私は基本的な画像処理操作を考えています。例えば
、あなたが示した行:
DeleteSmallComponents[Binarize[img, {0, .2}]];
は、アルゴリズムによってOpenCVの中で表現することでした:
- 2値化画像
形態学的に近いか、シンプル/オープン拡張/浸食(に基づきますオブジェクトと背景の色は何ですか):
cv::threshold(img, img, 100, 255, CV_THRESH_BINARY);
cv::dilate(img, img, cv::Mat());
cv::dilate(img, img, cv::Mat());
さらに独自の距離変換を実装する、または角を検出するために、例えば(という基本は、OpenCVの中に実装されている)ヒットとミス・ルーチンを使用することができます。
cv::Mat kernel = (cv::Mat_<int>(7, 7) <<
0, 1, 0,0,0,0,0,
-1, 1, 0,0,0,0,0,
-1, 1, 0,0,0,0,0,
-1,1,0,0,0,0,0,
-1,1,0,0,0,0,0,
-1,1,1,1,1,1,1,
-1,-1,-1,-1,-1,-1,0);
cv::Mat left_down,left_up,right_down,right_up;
cv::morphologyEx(img, left_down, cv::MORPH_HITMISS, kernel);
cv::flip(kernel, kernel, 1);
cv::morphologyEx(img, right_down, cv::MORPH_HITMISS, kernel);
cv::flip(kernel, kernel, 0);
cv::morphologyEx(img, right_up, cv::MORPH_HITMISS, kernel);
cv::flip(kernel, kernel, 1);
cv::morphologyEx(img, left_up, cv::MORPH_HITMISS, kernel);
大きなドット(単一の拡張後)と
もう一つの絵:
、その後、あなたは次のように絵を持っています
最後に、見つけたコーナーの座標を処理して部屋を決定することができます。
EDIT:ような「二重壁ライン」とのイメージのため: 我々は最初の二重壁のラインを「マージ」する必要があり、そのコードは次のように表示されます
:
cv::threshold(img, img, 220, 255, CV_THRESH_BINARY);
cv::dilate(img, img, cv::Mat()); //small object textures
cv::erode(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)),cv::Point(-1,-1),2);
cv::dilate(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)), cv::Point(-1, -1), 3);
をし、その結果画像は:
悲しいことに、画像のプロパティを変更する場合は、slightlする必要がありますアルゴリズムパラメータを変更する。一般的な解決法を提供する可能性はありますが、問題の可能な変形の大部分を決定しなければならず、より複雑になります。
「コードなし」とはどういう意味ですか?その質問に対する答えにはたくさんのコードがあります。あなたはOpenCVで同じことをどうやってすることができますか?無数の書籍やチュートリアルを利用して画像処理やOpenCVの使い方を学ぶことができます。ある日、ソリューションを実装するのに十分な知識があります。 – Piglet
私の悪い、私はそれを修正します。私は主にこの行を理解していません DeleteSmallComponents [バイナリ化[img、{0、.2}]] – jonarya
何が分かりませんか?この行はimgを二進化して小さな成分を削除します。 – Piglet