514KBZIP
matlabは関数findpeakの極値を見つけるために持っている唯一の一次元の極値を見つけることができ、opencvは対応する関数を持っていない、いわゆる極値は、周囲の値よりも大きく、その後、極値の需要の程度を参照してください:ターゲットの付着のために、私は極値を見つけるために、この極値法を使用し、その後、+流域セグメンテーションは、効果は私が前に試したセグメンテーション方法よりも優れているだけでなく、シンプルで時間のかかる少ない。
Mat dist_image,eachpeaks,peaksshow。
distanceTransform(bwimg,dist_image, DIST_L2, 3);
ベクトル<ポイント> ピーク
findPeaks(dist_image,lengthresh,peaks,eachpeaks).
Mat imglabels,segresult.
watershedSegmentProc(bwimg,eachpeaks,peaksshow,imglabels,segresult);
このようにして見つかった中心領域点は、より正確で、分水嶺を分割するときにオーバーセグメンテーションが少なくなる。
しかし、この方法はもう少し最適化されるべきです。この方法で見つかった極は、複数の極を見つける単一の大きな目的に対して友好的ではないからです。最適化されたコードについては(社内使用のため)掲載しない。
ひとつ疑問がある。今日、デバッグをしたとき、流域の結果に未知のエリアがまだ割り当てられていなかったのはなぜだろう?
ここで0-未知の領域に値があるのは驚くべきことで、明らかに流域がすでに作られた後の結果である:
/* 流域分割処理
* srcmatbw-------- バイナリマップ シングルチャンネル
* everycenters---- 背景に黒 0、中心に白ドット 255 の分割可能な石の中心マップ
* imglabels------- 流域結果の背景は100、分割線は-1、分割可能な石は1~N(0は既に許容されているかもしれない)
* */
イント 流域セグメント(Mat&srcmatbw、Mat&everycenters、Mat&imglabels)
{
// int not_zero_count=countNonZero(srcmatbw);
// float white_count_thre=srcmatbw.rows*srcmatbw.cols;
// white_count_thre*=0.8;
// if((not_zero_count(int)white_count_thre))
// {
// 2を返す;
// }
Mat element = getStructuringElement(MORPH_ELLIPSE, Size()11, 11));
Mat element2 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat binary_dilate.//各センター
dilate(everycenters, binary_dilate, element2, Point(-))1, -1), 1);
Mat binary_8UC3.
vector resultmats.
resultmats.push_back(srcmatbw);
resultmats.push_back(srcmatbw); resultmats.push_back(srcmatbw).
resultmats.push_back(srcmatbw); resultmats.push_back(srcmatbw).
merge(resultmats,binary_8UC3);
Mat unknown.//未知の領域、つまり分割線の境界線に関わる領域を求める。
bitwise_xor(srcmatbw,binary_dilate,unknown)。
//マーカー画像をマージする
Mat imgstats, imgcentroid.
connectedComponentsWithStats(binary_dilate, imglabels, imgstats, imgcentroid); //接続性フィールドマーカー
imglabels.convertTo(imglabels, CV_32SC1); // 画像タイプ変換
imglabels = imglabels +(イムグラベルズ 100;//背景は100ピクセル
にとって (int i=0i<unknown.rows;i++)
{
uchar* ptr = unknown.ptr(i);
にとって (int j=0j<unknown.cols;j++)
{
もし (255==ptr[j])
{
imglabels.at(i,j)=次のようになります。 0; // 未知の領域のピクセルは0
}
}
}
//流域セグメンテーション
watershed(binary_8UC3, imglabels).
}
その0はどうなっているんだ?
/**********************************************************************/
opencv 4.1がDropOutまたはBatchNormノードを持つtensorflow学習済み.pbモデルを呼び出すことについて、新しい同僚が、opencv c++はそれをサポートしていないと言った:
tensorflowのグラフをバッチノルムでopencv dnnにエクスポートする - OpenCV Q&A Forum
OpenCV: modules/dnn/src/tensorflow/tf_importer.cpp | Fossies
dnn: op dropout/Shape in function populateNet のレイヤタイプが不明 - Issue #9563 - opencv/opencv - GitHub
OpenCVでKerasモデルをtensorflowバックエンドでロードする方法 - OpenCV Q&A Forum
Tensorflow C++のトレーニングからデプロイまで(3):KerasによるCNNのトレーニングとデプロイ - Tech Liu
C++とphase_trainノード - Issue #357 - davidsandberg/facenet - GitHub
opencv4.1のソースコードをチェックしてみると、fushBatchNormインターフェイスが書かれている:
見てください、このノードを認識しています。pythonで学習済みモデルをロードする前に、opencv c++が指定した方法でなければならないのだと思います。
ドロップアウト・ノードについては、今のところopencvのソースコードにはありませんが、ネット上で解決策が語られているのを見たことがあります:
また、別の人は、パイソンとopencv c++の呼び出しで、ドロップアウトノードを使ってモデルを訓練するコードまで書いた。
opencv c++はpythonより少し厳しいだけで、そのルールに従ってロードします。
今日、壁越しに画像セグメンテーションに関する非常に有益な情報を見つけたが、残念ながら対応するコードはない。
別のプロジェクトで実装する時間があればいいのですが。以下は、論文の結果です。重なりが多く、焦点の合っていないダイアグラムに対して、より効果的だと感じています!
リソース・ステートメント(購入はこのステートメントに同意したものとみなされます): 1.ウェブサイトプラットフォームの任意の操作は、読んでいると見なされ、ウェブサイトの登録契約と免責事項の一番下に同意して、このサイトのリソースは、超低価格されており、技術サポートを提供していません。 2.一部のネットワークユーザーは、障害の発生などのネットディスクアドレスが無効である可能性があり、顧客サービスコード711cn#qq.com(@で#を置き換える)に電子メールを送信してください共有する送信するように構成されます。 3.本サイトは、すべてのダウンロード可能なリソース(ソフトウェアなど)のサイトがないことを確認するために提供する否定的な変更;しかし、このサイトは、リソースの正確性、安全性と完全性を保証することはできません、ユーザーは、独自の判断でダウンロードし、我々はすべてのソースコードは100%エラーフリーまたはバグがないわけではありませんの目的のために学ぶために通信する;あなたは、コードを読み、理解することができるように一定の基盤を持っている必要があり、デバッグを変更することができます!コードを修正し、エラーを解決するためには、一定の基礎が必要です。同時に、このサイトの利用者は、ソースコードコンビニエンスストアがダウンロードのために提供されるソフトウェアに関するいかなる権利も所有していないことを理解する必要があり、著作権はリソースの法的所有者に帰属します。 4.このサイト上のすべてのリソースは、学習や研究目的のためにのみ、ダウンロードしたリソースの24時間以内に削除する必要がありますしてください、商業目的のために使用しないでください、そうでなければ、サイトと担保責任サイトの出版社から生じる法的紛争を負担することはありません! 5.複製可能なリソースの性質上、一度購入されたリソースの払い戻しはできません。