2016-12-23 2 views
0

내 배경이 C++이고 OpenCV를 사용하는 내 응용 프로그램 중 하나를 EmguCV를 사용하는 C# 응용 프로그램으로 변환하려고했습니다. 나는 EmguCV 문서와 Wiki뿐만 아니라 StackOverflow Q/As를 인간적으로 가능한 한 깊이있게 읽었습니다. 기본적인 문제를 푸는 데는 운이 없었습니다. 이 시점에서 EmguCV에 대해 생각하는 방식이 근본적으로 결함이 있는지 궁금합니다. 나는 인상을Emgu CV 3.1을 사용하여 올바른 메모리 관리 방법

였습니다 EmguCV는 C에 대한 인터페이스를 제공하는 경우는 포인트로 자신의 메모리 관리를 돌봐 아래,의는 FloodFillCvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...)를 사용하는 가정 해 봅시다 대한 ++ 라이브러리 나의 A 경우 Mat을에서 반환 IInputOutputArray의 () 모두 처리됩니다. 그러나 실제로는 CvInvoke.FloodFill에 대한 호출이 dll에서 예외로 인해 실패합니다.

int i = ... 
int j = ... 
int intensity = ... 
int height = img.Rows; 
int width = img.Cols; 
Mat outputMask = new Mat(height + 2, width + 2, DepthType.Cv8U, 1); 
Rectangle dummy = new Rectangle(); 
CvInvoke.FloodFill(img, outputMask, new Point(i, j), new MCvScalar(255), out dummy, new MCvScalar(intensity), new MCvScalar(intensity), Connectivity.EightConnected, FloodFillType.MaskOnly); 

그러나 전화는 도움이되지 않습니다 예외 설명과 함께 실패

이 내가 가진 것입니다. GCHandle 할당 및 고정 방법을 사용하여 밑의 원시 데이터에 액세스 할 수있는 다른 방법을 구현했지만 일부 로컬 Mat에서 호출 할 때 CvInvoke.FloodFill이 안전해야한다고 생각합니다.

제 질문은 EmguCV가 C++ 및 OpenCV를 사용하여 제 배경에 사용되는 방식으로 완전히 벗어 났는지 여부입니다. 그렇다면, 그러한 기능을 호출하는 올바른 방법은 무엇입니까?

답변

0

EmguCV 3.1 FloodFill과 동일한 문제가있는 사용자를위한 것입니다. 꽤 오랜 시간 동안 내 코드를 디버깅 한 후, 나는 EmflCV 3.1 구현 인 CvInvoke.FloodFill이 버그라고 확신한다. FloodFillType.MaskOnly 깃발을 사용하여 그 방법에서 가면을 얻을 방법이 없었습니다.

대신 그때, 0254 사이의 값을 가지고 내 원래 이미지를 편집 결국 정상적인 플러드 필이 255의 값을 채울 사용했다. 그런 다음 Image.InRange() 방법을 사용하여 원본 이미지에서 모든 255 픽셀을 채 웁니다. EmguCV 팀에 버그를보고하고 무슨 일이 일어나는 지 볼 것입니다.

관련 문제