검색결과 리스트
프로그래밍/OpenCV 에 해당되는 글 11건
- 2022.10.23 OpenCvSharp Byte to Bitmap
- 2022.10.23 OpenCvSharp Mat to byte array
- 2022.08.15 C# OpenCV설치
- 2022.08.15 OpenCV System.AccessViolationException 발생
- 2021.10.07 Visual Studio 설정 가져오기 및 내보내기
- 2015.02.03 Blob Detector (물방울 검출)
- 2015.01.29 Perspective Transformation - Image warping
- 2014.12.24 BMP와 JPG의 차이점
- 2014.12.22 OpenCV 3.0 스타트
- 2008.09.04 Lucas Kanade Tracking 에 관하여
- 2008.08.19 Point Tracking 에러
프로젝트 - NuGet 패키지 관리 가서
OpenCV 검색하면 OpenCvSharp3-AnyCPU 로 설치해서 진행하면 된다
OpenCvSharp4 로 설치했다가 별별 에러가 다 생겨서 포기하고
다시 설치하니 되었다
64비트 시스템에서 dll을 x86으로 설정해서 사용할 때 발생한다
C#에서 OpenCV를 제대로 한 번 실행 시키기가 매우 어렵다
예전에 많이 써 먹던 기능인데 오래되어 기억이 안 나서 다시 정리한다
C++에서 OpenCV나 다른 라이브러리들을 사용할 때
매번 링크 경로 설정하고 파일 이름 가져다 쓰는 것이 번거로워서
설정 내보내기를 이용해 설정 파일을 저장한다
우선 OpenCV Include 파일 경로를 설정한다
속성 페이지 - C/C++ - 일반 - 추가 포함 디렉터리
그 다음 OpenCV에서 사용할 라이브러리 경로를 설정한다
속성 페이지 - 링커 - 일반 - 추가 라이브러리 디렉터리
그 다음 사용할 라이브러리 목록을 다음 위치에 추가한다
속성 페이지 - 링커 - 입력 - 추가 종속성
그 이후 다른 프로젝트를 생성했을 때 저장한 파일을 설정 가져오기를 하여 적용하면 동일한 라이브러리 파일과 경로를 설정할 수 있어서 편하다
방법은 다음과 같다
우선 OpenCV를 설정할 라이브러리 경로와
도구 - 설정 가져오기 및 내보내기 - 선택한 환경 설정 내보내기
- 내보낼 설정 선택 - 설정 파일 이름 지정 - 마침 을 누른다
설정하여 저장한 파일이 해당 경로에 있는지 확인한다
SimpleBlobDetector 내에 있는 Params 파라미터 변수를 선언하여 세팅한 후
detect()함수를 이용하여 검출하면 된다.
정말 깔끔한 코드이다... 모든 Detector가 다음과 같은 형태를 가진다
잘 보고 배워야지...
두 개의 값은 다르게 나온다
bmp 저장은 배열의 값 그대로 나오고
jpg는 압축 되어서 나오기 때문에 다른 픽셀값으로 출력된다.
이걸 몰라서 일주일 헤매었다 ㅠㅜ
3D 그래픽스 쪽으로 회사를 다니다가
새로운 회사에서 영상처리를 하느라 다시 OpenCV를 사용하기 시작했다
내가 예전에 사용하던 버전은 1.0인데 벌써 3.0까지 나와서
지금은 3.0으로 사용하고 있다...
적응하는데 시간이 오래 걸릴 거 같다...
열심히 해야지...
if(ptnum > 0)
{
cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
m2DOld, m2DNew, ptnum, cvSize(win_size, win_size),
3, status, 0,
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);
flags |= CV_LKFLOW_PYR_A_READY;
int k = 0;
for(int i = 0; i < ptnum; ++i)
{
if( !status[i] )
continue;
m2DNew[k++] = m2DNew[i];
}
ptnum = k;
}
if(add_point)
{
m2DNew[ptnum].x = (float)pt.x;
m2DNew[ptnum].y = (float)pt.y;
add_point = false;
cvFindCornerSubPix( gray, m2DNew, ptnum,
cvSize(win_size,win_size), cvSize(-1,-1),
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
++ptnum;
}
tracking을 먼저 한 다음에 점을 추가해야
tracking이 제대로 된다
if(add_point) 를 한 다음에
if(ptnum > 0)
를 실행하면 new2D 에 0.413 등의 소수점으로 바뀌어서
계속 tracking이 되지 않는다
주의하자
생각하건데 OpenCV 모든 함수에서도 그렇겠지만
함수의 인자에서 포인터를 넣으면 안 된다
예를 들어서
class CDataSet
{
protected:
CvPoint2D32f * m2DNew;
CvPoint2D32f * m2DOld;
public:
CvPoint2D32f * GetNew() { return m2DNew; }
CvPoint2D32f * GetOld() { return m2DOld; }
};
이라고 했을 때
cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
OldPt, NewPt, *n,
cvSize(win_size, win_size), 3, status, 0,
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);
이렇게 했을 때
Point Tracking 이 되지 않는다.
이거 때문에 이틀을 날리고 그 다음에
두번째 실수이다 잊어버리지 말자
그래서 같은 클래스에 넣었었던 것으로 기억된다.