2011-11-11 3 views
0

cvsobel 함수를 사용할 때 몇 가지 문제가 있습니다. 나는적용 방법 cvsobel + emgucv

내 코드가

입니다 ... cvsobel가 16 비트 8 비트 ...

누군가가 나에게 내가 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은 사용자가 취하는 컬러 이미지입니다.

내가 생각 여기서 문제는 내가 여기에 16 비트 깊이를주고 함수 작업을 어떻게해야합니까 SobelHorizontal의 선언 ... 함께

..

답변

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

안녕 크리스, 고마워요 ... 저는 이미지에서 수평선과 수직선을 찾으려고 노력하고 있습니다. sobel 운영자를 사용하는 것이 올바른 방법인지 여부를 알려줌으로써 나를 도울 수 있습니까? – user671805

+1

솔직히 말해 Canny는 가장자리 감지에 더 효과적이지만 소벨과 달리 통과 할 방향을 정의 할 수 없습니다. 저는 Canny를 사용하여 HoughLines 연산을 사용하여 어떤 선이 강한 수직선과 수평선인지를 결정할 수 있습니다. 변수를 가지고 노는 것으로 각도를 선택할 수 있습니다. 그 이유는 sobel을 사용해도 이미지 내에서 이러한 줄을 찾아야하기 때문입니다. 당신이 꼼짝 못하게되면 언제든지 물어볼 수 있습니다. – Chris

0

Image<Gray, short> 

, 또는 SobelHoriz 정의 whatewer는 C#에서 16 비트 정수로 명명됩니다. 그리고 회색에 다시 얻기 위해 image.convertTo() 함수를 사용

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

난 당신이 C#에서 호출 방법을 모르겠어요. C++로, 이미지 객체는() 회원 가입일를 ConvertTo을 가지고

+0

난 당신이해야 할 모든 sobelHorizontal의 당신의 정의 짧은에 바이트를 변경하는 것입니다 ... 초기화에 대한 SobelHoriz의 크기를 알고 – user671805

+0

필요하기 때문에 does'nt 작동합니다. 그런 도전적인 프로젝트를 시도하기 전에 C# 프로그래밍의 기본 사항을 알고 있는지 확인하십시오. – Sam

+0

'Image = 새 이미지 <회색, 짧은> (grayImage.Size)'나에게 똑같은 오류를 준다 ...... 그러나 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>();