1. スクリプトインポート名前空間
クリックすると表示されるページはこんな感じなので、必要なものをインポートしてください!
「OK」をクリックした後、矢印(スクリプトをツールに書き込む)をクリックすることを忘れないでください。
2. コードの作成を開始する
- 使用するツールをインポートして、後でRun()できるようにします。
CogPMAlignTool PM = mToolBlock.Tools["CogPMAlignTool1"] as CogPMAlignTool;
CogFixtureTool fix = mToolBlock.Tools["CogFixtureTool1"] as CogFixtureTool;
CogFixtureTool fix1 = mToolBlock.Tools["CogFixtureTool2"] as CogFixtureTool;
CogIPOneImageTool ipo = mToolBlock.Tools["CogIPOneImageTool1"] as CogIPOneImageTool;
- 変数のインポート: 必要な変数をインポートします。使いやすいです (変数を使用すると、最適な値の範囲を見つけるためにデータを調整することが容易になります!)
bool bTrue = (bool) mToolBlock.Inputs["bTrue"].Value;
double dMean = (double) mToolBlock.Inputs["dMean"].Value;
double dVariance = (double) mToolBlock.Inputs["dVariance"].Value;
- ツールを格納するための配列の使用については、後のサイクルで使用するのに便利です
CogHistogramTool[] His = new CogHistogramTool[]{
his1, his2, his3, his4};
CogBlobTool[] Blob = new CogBlobTool[]{
blob1, blob2, blob3, blob4};
- return を合理的に使用すると、実行時間を最適化できます。
if(PM.Results.Count != 8)
{
mToolBlock.Outputs["FlowResult"].Value = bTrue ? true : false;
return false;
}
对于当符合某一个条件就能判断结果时,使用return,可以直接不运行后面的代码,节省很多时间。
- グローバルプロパティを定義する
#region Private Member Variables
private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
ここでは、グローバルに使用される定数または変数をいくつか書くことができます。以下は、それらを保存するために使用されるラベルを定義するコレクションです。使用されるコードは以下に掲載されます。(どちらも大丈夫です)
System.Collections.ArrayList LabelList = new System.Collections.ArrayList();
// CogGraphicCollection LabelList = new CogGraphicCollection();
コードスニペットの説明
for(int i = 0; (i < 8 && i < (int) mToolBlock.Inputs["test"].Value); i++)
{
fix.RunParams.UnfixturedFromFixturedTransform = PM.Results[i].GetPose();
fix.Run();
his1.Run();
his2.Run();
- Inputs["test"] は、デバッグを容易にするために上で説明したインポートされた変数です。ここではループが使用されているためです。デバッグが必要な場合は、test の値を入力し、どのループで停止してそれがどこにあるかを確認することを選択できます。 . 何か問題が発生しました。
- **.Run()** を使用すると、特定のツールを実行できます。
- 別のコード行は、ツール内のPM.Results[0].GetPose() をfix.RunParams.UnfixturedFromFixturedTransformにリンクすることと同等です。ただし、ここではテンプレートツールの結果が8つあるので、CogFixtureToolツールの座標系位置空間(X、Y軸、角度空間座標系)を実現するコードを使用します。
コードスニペット 2 の説明
接上面的第一个for 循环
double dx = 0;
double dy = 0;
for(int j = 0 ; j < His.Length ; j++){
CogGraphicLabel Mylabe = new CogGraphicLabel();
CogTransform2DLinear newTrans = PM.Results[i].GetPose();
CogRectangleAffine rect = His[j].Region as CogRectangleAffine;
rect1 = rect.MapLinear(newTrans, CogCopyShapeConstants.GeometryOnly);
//rect1 = rect.MapLinear((CogTransform2DLinear)fix1.OutputImage.PixelFromRootTransform, CogCopyShapeConstants.All);
rect1.Color = CogColorConstants.Orange;
LabelList.Add(rect1);
newTrans.MapPoint(rect.CenterX, rect.CenterY, out dx, out dy);
- ここでも for ループが使用されており、アルゴリズムでは 4 つのCogHistogramToolツールを使用するため、 His[j] は配列を使用してループに適用するだけです。
- new CogGraphicLabel() を使用すると、画像ラベルをカスタマイズして、前のグローバル変数 LabelList --> LabelList.Add(rect1)に追加できます。
- newTransは 2D ライン変換領域です。newTrans.MapPoint –> は通常、Map の先頭を使用して出力をコピーまたはマップします。ここでは、rect.CenterXの座標がdxにコピーされます。
- rect.MapLinearとはnewTrans領域にあるもの(角度、辺の長さ、中心など)をコピーすることを指しますが、モードがたくさんあります!
注:第一个参数 CogTransform2DLinear类型 要和工具所选空间名称对比一下,一不一致都无所谓但要注意转换成自己想要的效果。
比如:
不一致时,可以将第二个参数设置为 CogCopyShapeConstants.GeometryOnly(只复制几何形状,而不复制坐标)
一致时,可以设置为 CogCopyShapeConstants.All(全部复制,包含坐标点,角度等)。
- His[j].Region は、CogHistogramToolツールで使用される領域の形状を指します。
コード スニペット 3 の説明
接上面的第二个for循环,相信这段很多都能看懂,都是一些基本的判断语句。
if(His[j].Result.Mean > dMean){
Mylabe.SetXYText(dx, dy, "OK");
Mylabe.Color = CogColorConstants.Green;
LabelList.Add(Mylabe);
}else{
rect1.Color = CogColorConstants.Blue;
fix1.InputImage = PM.InputImage;
fix1.RunParams.UnfixturedFromFixturedTransform = PM.Results[i].GetPose();
fix1.Run();
Blob[j].InputImage = fix1.OutputImage;
blobAffine = rect.MapLinear(newTrans, CogCopyShapeConstants.GeometryOnly);
blobAffine.Color = CogColorConstants.Blue;
blobAffine.SetOriginCornerXCornerY(rect.CornerOriginX, rect.CornerOriginY, rect.CornerXX, rect.CornerXY, rect.CornerYX, rect.CornerYY);
blobAffine.SideXLength *= 10;
Blob[j].Region = blobAffine;
Caliper[j].Region = blobAffine;
Blob[j].Run();
Caliper[j].Run();
if(Caliper[j].Results[0].Width > 50 && Caliper[j].Results[0].Width < 75){
Mylabe.SetXYText(dx, dy, "OK");
Mylabe.Color = CogColorConstants.Green;
LabelList.Add(Mylabe);
}else{
mToolBlock.Outputs["FlowResult"].Value = bTrue ? true : false;
Mylabe.SetXYText(dx, dy, "NG");
Mylabe.Color = CogColorConstants.Red;
LabelList.Add(Mylabe);
}
Blob[j].InputImage = null; //后面会注释掉
Caliper[j].InputImage = null; //后面会注释掉
Blob[j].Run(); //后面会注释掉
Caliper[j].Run(); //后面会注释掉
}//大if
}//for循环
}//大for循环
- fix1.InputImage = PM.InputImageおよびBlob[j].InputImage = fix1.OutputImageこれらの段落の理由は、これがif...elseステートメントであるため、コードを最適化し、実行時間を節約するためです。そして、通常の状況 ( His[j].Result.Mean > dMean ) では、この条件は基本的に成立するため、ほとんどの場合、ツールを使用する必要はなく、処理を実行する必要もありませんが、状況は次のとおりです。CogToolBlockの実行をクリックしている限り、
すべてのツールが実行されます(以下の検証結果の後、コード内で .Run() を実行するすべてのツールが実行されます)。また、ツールは最後の実行の入力画像を保持し、最後の入力画像。これはfix1.RunParams.UnfixturedFromFixturedTransform = PM.Results[i].GetPose( )
というコードと同じ意味で、以下の図を組み合わせるとおおよその意味が理解できると思います。
これがツールリンクの通常の状態です
これは、コード ( fix1.InputImage = PM.InputImage ) で実現されるツール リンクの状態です。
ここでBlobツールが普及した理由は、ループの後にBlob[j].InputImage = nullが実行され、Blobツールの入力イメージがnullに設定されるためです。
もちろん、単純にInputImageを使用するだけではまだ十分ではありません。最後のInputImage (つまりLastRun.InputImage )がまだ存在しており、ここには画像がまだ存在しており、これによりBlobツールが実行されます。画像なしでBlobツールを実行するのと画像ありでBlob ツールを実行するのとでは、大きな違いはありませんが、重要なのはコードの最適化の考え方であり、最適化したいという心を常に持つ必要があります。したがって、 Blobをnull(Blob[j].InputImage = null
) に設定する場合は、 Blob[j].Run()を 1 回実行する必要があります。なぜRun()なのでしょうか。Blob[j].InputImage = nullの場合、Blobを実行するためツールは人気になります (Blob[j].Run() をコメント アウトして CogToolBlock を実行し、次に Blob ツールに移動して手動で実行し、その後出てきて Blob ツールが人気になったかどうかを確認できます)。 Blob人気が高まり廃棄されます。使用される場合は、Blob[j].InputImage = fix1.OutputImageを実行します。(下線が引かれている部分は冗長です)
注: Blob[j].Run()は、前の文ではなく最後の文です。
しかし、自分の考えが正しいと思っていた矢先、コード検証の実行は私の予想を超えていました。実際、私の結論のいくつかは間違っていたことが証明されました。 Blob の LastRun.InputImage はそれ自体では実行されません。コード これは、上記で.Run() メソッド、またはBlob[j].InputImageに画像があり、nullではない場合にのみ実行されます。
(これは、NG エラー プロダクトが最初に実行された場合の Blob ツールと Caliper ツールの実行時間の結果です)
(これは、OK プロダクトの実行直後に NG プロダクトを実行した場合の Blob ツールと Caliper ツールの実行時間の結果です。結果は上記とまったく同じです。これは何を証明しますか? ツールが実行されていないことを証明します。アルゴリズムは 2 つの同一の画像を同じ計算時間で実行できるほど安定していないため、同じ画像であっても多少の時間差が生じます。信じられない場合は、以下の検証を読んでください。)
(これは NG の間違ったプロダクトです。理由は聞かないでください。なぜなら、私の上記の結論が正しい場合、else コードを使用していない OK プロダクトを取得した場合、BLOB ツールは同じコードで使用された計算時間を検証できません。画像アルゴリズムは、blob ツール (blob.Run()) をまったく実行しないため、一貫性がありません。
検証手順: NG 製品イメージを選択 --> CogToolBlockで実行します。
最初の実行結果:
2 回目の実行の結果:
結論 1: 2 つの結果は異なります。これは、アルゴリズムが 2 つの同一のグラフを操作する場合、計算時間も異なることを意味します。
結論 2: BlobのLastRun.InputImageは単独では実行されません。コード上で.Run() メソッドを実行する場合、またはBlob[j].InputImageに画像があり、nullではない場合にのみ実行されます。したがって、最後のBlob[j].Run() と Caliper[j].Run() を直接コメント アウトする必要はありません。
-
変数blobAffine、変数blobAffine は、 BlobツールBlob[j].RegionおよびCaliper[j].Regionの領域を設定するために定義されています。これは、実行が過度にならないようにするためです (テンプレートに多少の逸脱がある可能性があるため)一致)を指定し、原点や辺の長さなどを設定します。また、CogRectangleAffineクラスのorigin属性は直接代入することができず、書き始めた当初は配置空間についてよく分からなかったので、SetOriginCornerXCornerY()メソッドを使用して原点を設定しています。
。。しかし、このメソッドが存在する以上、意味があるはずであり、コードでしか実装できないという実態はありません。 -
上記のBlob[j].Run() は冗長ですが、Blob[j].InputImage = nullも冗長です。
(これは、NG エラー プロダクトが最初に実行され、次に OK プロダクトが実行される場合の OK プロダクト操作の実行時間であり、Blob[j].InputImage = null のコードはコメント化されません)
次に、同じ OK プロダクトを再度実行すると、Blob ツールの実行時間が変わっていないことがわかります。ただし、手動で入力して実行すると、時間が変わります。これは、ツールが実行されていないことを示しています。
(NG プロダクトを先に実行するが、今回は Blob[j].InputImage = null のコードをコメント化した場合、NG プロダクトの Blob 操作の実行時間は下図のようになります)
次に、OK プロダクトに切り替えて実行すると、OK プロダクトの Blob 計算の実行時間が上記と一致しており、変化していないことがわかります。
結論: Blob[j].InputImage = null の有無にかかわらずコードの実行時間は同じであり、xxxを実行しない限り、 xxx.InputImageの有無に関係なく、ツール内でコードの実行時間は同じであることがわかります。コード内でRun()を実行するか、ツールxxxを手動でクリックします。どちらも単独では実行されず、コードの実行時間に影響します。
3. CogFixtureToolの紹介
CogFixtureTool は、独自の座標系の再定義、原点の再定義などを行うための位置決めツールです。ツールのインターフェイスは次のとおりです。
まず最初に、次の図に示すように、初期イメージの元の原点は左上隅であり、初期の座標系空間でもあることを理解する必要があります。
一般に、CogFixtureToolツールは、テンプレート マッチング ツールCogPMAlignToolを使用するときに使用されます。そして通常、CogPMAlignTool結果の中心原点が新しい座標系の原点としてCogFixtureToolに割り当てられます。以下の図は、コードfix.RunParams.UnfixturedFromFixturedTransform = PM.Results[i].GetPose()を使用して実装されているため、線でリンクされていません。
リンク後、CogPMAlignToolの中心原点が下図の新しい座標系の原点になります。
このとき、後で使用するツールは新しい空間座標系を使用できます。たとえば、ここでは「@\Fixture」が使用されます。
おそらく多くの人はまだ漠然としていますが、これは何の役に立つのでしょうか? 以下に模式図を描いて説明します。
- 入力画像はこんな感じで、商品に汚れが多いか少ないかを調べるのが目的です。
- 最初のステップは、テンプレート マッチングを通じて製品を検索し、テンプレート内のどこかに中心原点をマークします。これにより、テンプレートと一致する製品の中心原点が製品の右上に固定され、x と y が固定されます。方向は、見つかったテンプレートの方向に対して相対的に変化しません。
- CogFixtureToolツールを使用して、中心原点、x、y、および回転角度に一致するテンプレートを使用して新しい座標空間を確立します。
- CogHistogramToolツールを使用して汚れを検出し、空間名を新しい座標空間の空間名に設定します。たとえば、図に示されているCogHistogramToolツールの原点位置は x=-113.69; y=70 で、回転は新しい座標空間の原点に対して 90 度です。
- このように、製品がどのように移動しても、新しい座標空間の原点に対するCogHistogramToolツールの原点は x=-113.69; y=70 となり、回転は 90 度になります。新しい座標空間の原点 (つまり、テンプレート マッチング結果の中心原点) に従います。
UnfixturedSpaceとfixturedSpaceの違いに注意してください。
fixturedSpaceを使用する場合、リンクされたCogFixtureToolのOutputImageツールは、同じスペース名"input image space"と"@\Fixture"を使用します。
UnfixturedSpaceを使用すると、リンクされたCogFixtureToolのOutputImageツールは、スペース名「input image space」と「@\Fixture」を矛盾して使用します。ここでの **「入力画像空間」** は、受信するCogFixtureTool画像の空間です。