2011-11-11 10 views
0

cvsobel関数の使用にはいくつか問題があります。私はcvsobel + emgucvの適用方法

私のコードは

です...誰かが私は、私は戻って8ビットにそれを拡張することができます方法を見つけ出す手助けすることができます... cvsobelは16ビットに8ビットから画像の深さを増加させることを

を読んだことがあります

Image<Gray, Byte> grayImage = TestImage.Convert<Gray, Byte>().PyrDown().PyrUp(); ; 
Image<Gray, Byte> Dest = new Image<Gray, Byte>(grayImage.Size); 
Image<Gray, Byte> SobelHorizontal = new Image<Gray, Byte>(grayImage.Size); 
CvInvoke.cvCanny(grayImage, Dest, 10, 60, 3); 
CvInvoke.cvSobel(Dest, SobelHorizontal, 1, 0, 3); // introduces exception 

ここで、TestImageはユーザーからのカラー画像です。

問題ここで私は

答えて

2

はまあEMGUは、実際にはC#でソーベルとキャニーの実装を持っていました:

//grayImage.Canny(Gray thresh, Gray threshelinking) 
grayImage.Canny(new Gray(10), new Gray(60)); 
//grayImage.Sobel(int xorder, intyorder, int aptureSize) 
grayImage.Sobel(1, 0, 3); 

あなたが望むようバシレはあなたを述べたようにこれは、しかし、あなたが直面している問題なく行う必要がありますあなたの画像のデータ型を宣言することができます、しかし、あなた

Image<Gray,short> Image<Gray,double>, or Image<Gray,float>. 

よう乾杯、

クリス

+0

Hey Chris、ありがとうございました...私はイメージの水平線と垂直線を見つけようとしていますので、ソベルの演算子を使用するのが正しい方法かどうかを教えてください。 – user671805

+1

正直言って、Cannyはエッジを検出する方が効果的ですが、ソベルとは異なり、どの方向を通過するかを定義することはできません。私はCannyを使ってHoughLines演算を使用して、どの線が強い垂直線と水平線であるかを判断することをお勧めします。これは、変数を使用して角度を選ぶことができます。あなたがソベルを使ったとしても、イメージ内でこれらの線を見つける必要があるからです。もしあなたが立ち寄って気軽に聞いてみると、何か質問にお答えしようと思います。 – Chris

0

Image<Gray, short> 

としてSobelHorizを定義する、または..私はここでは16ビットの深さを与え、機能を動作させるにはどうすればよい... SobelHorizontalの宣言であると思いますwhatewerはC#で16ビット整数と呼ばれます。そして、グレーに戻ってそれを得るためにimage.convertTo()関数を使用します。

Image<gray, byte> sobelDisplay; 
sobelHoriz.convertTo(sobelDisplay); 

私はあなたがC#でそれを呼び出す方法がわかりません。 C++では、画像オブジェクトはにconvertTo()メンバー

+0

does'nt仕事私は初期化... – user671805

+0

ためSobelHorizのサイズを知っておく必要がありますので、あなたがしなければならないのは、sobelHorizo​​ntalのあなたの定義でショートにバイトを変更することです。また、このような難しいプロジェクトを試す前に、C#プログラミングの基礎を理解していることを確認してください。 – Sam

+0

'Image = new Image (grayImage.Size)'私はsobelで同じエラーを出します......しかし、Chrisの解決策は私を助けました...ありがとうございました – user671805

0

直接設定することもできます。

例:

Image<Emgu.CV.Structure.Gray, byte> objImagemTemplate = new Image<Emgu.CV.Structure.Gray, byte>(objBitmapTemplate); // Image A 
objImagemTemplate = (objImagemTemplate.Canny(new Gray(10), new Gray(60)).Sobel(1, 0, 1)).Convert<Gray, Byte>(); 
関連する問題