카테고리 없음

color detect 컬러 디텍트 방식과 MVC 패턴의 적용 효과

구름갈대호수 2022. 3. 21. 15:52

color detect 방식의 적용과 효과

 

이름에서 보듯 MVC 패턴은 세 가지 컴포넌트를 갖는다. 각 역할을 살펴보면 다음과 같다.

모델은 애플리케이션에 관련된 정보를 포함한다. 애플리케이션이 처리하는 모든 데이터를 갖는다. 새로운 데이터가 만들어질 때 컨트롤러에게 알려주면 새로운 결과를 띄우기 위한 뷰를 요청한다. 가끔은 모델이 여러 알고리즘을 함께 묶는데, 전략 패턴에 따라 구현 가능하다. 모든 알고리즘은 모델의 일부이다.

뷰는 사용자 인터페이스에 대응한다. 사용자에게 데이터를 보여주고 애플리케이션과 상호 작동하는 위젯들로 구성된다. 뷰의 역할 중 하나는 사용자가 내린 명령을 컨트롤러에게 전달하는 것이다. 새로운 데이터를 사용할 땐 새로운 정보를 출력하기 위해 스스로 새로 고친다.

컨트롤러는 뷰와 모델을 함께 이어주는 모듈이다. 뷰의 요청을 받고 모델내 적절한 메소드에 전달한다. 또한 모델의 상태를 바꿨을 때 통지함에 따라 새로운 정보를 출력하기 위해 새로 고치도록 뷰에 요청한다.

detect controller 효능과 클래스 구현 방법


이전 예제에서 했던 그대로 ColorDetect 클래스를 사용한다. 이번에는 모델에 애플리케이션 로직과 기본 데이터를 포함한다. 또한 컨트롤러를 구현하는데, Color DetectController 클래스다. 그러면 가장 적합한 위젯이 들어간 매우 정교한 GUI를 구축하기가 쉬워진다. 예를 들어 Qt를 사용하면 다음 인터페이스처럼 만들 수 있다.

color detector 기술
color detector 기술

 

cv : Mat 의 create 메소드 안에 확인하는 부분을 감쌌다. create 메소드는 행렬에 새로운 크기와 타입을 갖고 다시 할당할 때 사용하는 메소드다. 어쩌다가 이미 지정된 크기와 타입을 갖는 행렬이라면 아무런 작업을 하지 않으며, 인스턴스를 건드리지 않은 채 그냥 반환한다. 따라서 우리가 만든 함수는 입력 영상과 동일한 크기와 타입을 갖는 행렬(필요할 경우)을 만드는 create 호출부터 간단하게 시작한다.

result.create (image.rows, image.cols, image.type () );

create는 항상 연속된 영상continuous inage을 만드는데, 아무도 채워지지 않는 영상이다. 메모리 블록은 total ( ) *elemSize() 의 크기로 할당돼 있다. 다음 반복문은 두 개의 포인터를 사용한다.

for (int j=0; j<nl; j++)

// 입력 영상과 결과 영상의 j 행에 대응하는 주소를 가져오기 const uchar* data in= image.ptr<uchar>(j);uchar* data_out= result.ptr<uchar>(j);

for (int i=0; i<nc; i++) {

// 화소별 처리

data_out[i] = data_in[i]/div*div + div/2;

// 화소 처리 끝} // 행 끝

입력 영상과 결과 영상이 동일한 영상이라면 ColorReduce 함수는 예제의 첫 번째 버전과 완벽히 일치한다. 결과 영상이 다른 영상이라면 ColorReduce 함수는 호출 전에 해당 영상에 메모리를 이미 할당했든 아니든 상관없이 올바르게 작동한다.

연속된 영상을 효율적으로 조회

앞의 예제 분석’에서 설명했던 대로 효율상의 이유로 영상 내 각 행의 마지막에

 

image pixel 화소 컨트롤 방식

 

Image 2 Homography Points X]

호모그래피로 찾은 결과인 영내를 다음 반복문으로 그렸다.

// 영내 점 그리기

std::vector<cv:: Point2f>:: const iterator itPts=

points1.begin(); itin= inliers.begin();

std::vector<uchar>::const_iterator while (itPts! =pointsl.end()) { // 각 영내 위치에 놓은 원을 그리기 if (*itIn) cv::circle(image1, *itPts,3, cv:: Scalar (255,255,255),2); ++itPts: ++itin;

앞 절에서 설명한 그대로 일단 호모그래피를 계산하면 한 영상에서 다른 영상으로 영상 점을 이동할 수 있다. 사실 영상의 모든 화소에 대해 그렇게 처리할수 있고, 결과는 이 영상에서 다른 시점으로 이동된다. 이런 처리는 OpenCV함수로 다음과 같이 정확히 수행한다.

// 영상 1에서 영상 2로 워프CV::Mat result;

반복자는 영상의 요소에 접근하는 데 사용하므로 컴파일 시간에는 반환 타입이명시돼야 한다. 반복자는 다음과 같이 선언한다.

CV :: MatIterator <cv:: Vec3b> it;

또는 Mat 템플릿 클래스 안에서 정의된 iterator 타입을 사용할 수 있다.

CV:: Mat <CV:: Vec3b>::iterator it;

그러면 또 템플릿 메소드라는 점을 제외하고는 일반 begin과 end 반복자메소드를 사용해 조회할 수 있다. 이에 대해 컬러 감축을 다음과 예제 코드와같이 작성한다.

void colorReduce (cv:: Mat &image, int div=64)

// 초기 위치에서 반복자 얻기 CV:: Mat <cv::Vec3b>::iterator it = image.begin<cv::Vec3b>(); // 마지막 위치에서 얻기 CV::Mat_<cv::Vec3b>::iterator itend image.end<cv::Vec3b>(); // 모든 화소를 조회 for ( ; it!= itend; ++it) {

// 각 화소 처리 (*it) [0] = (*it) [0] /div*div + div/2; (*it) [1] = (*it) [1]/div*div + div/2; (*it) [2] = (*it) [2] /div*div + div/2; // 화소 처리 끝

video image의 pixel color handling method 화소 다루기

 


컬러 감축을 처리하기 때문에 반복자는 cv: Vec3b를 반환함을 기억하자.operator] 를 사용해 각 컬러 채널 요소에 접근할 수 있다.

결과는 다음과 같이 얻는다.

Detected Lines with Hough IX

그림에서 보듯 허프 변환은 단순히 영상에서 정렬된 에지 화소를 찾는다.잠재적으로 예기치 않은 화소 정렬로 인해 일부 잘못된 감지를 만들거나, 여러선이 동일한 화소 정렬을 경유한 여러 개를 감지할 수 있다.

이런 문제 중 일부를 극복하고 선 세그먼트를 감지(즉, 마지막 점과 함께)하기위해서 변환의 변종이 제안됐다. 이것은 확률적 허프 변환으로, OpenCV에서cv:: HoughLinesP 함수로 구현했다. 여기에 LineFinder 클래스를 생성해 이함수를 사용하며, 함수 파라미터를 캡슐화한다.

class Line Finder {

private:

// 원 영상

cv::Mat img;

// 선을 감지하기 위한 마지막 점을 포함한 벡터

std::vector<cv:: Vec4i> lines;

// 누산기 해상도 파라미터

double deltaRho;

7 선, 외곽선, 컴포넌트 추출 |

 

 

Outline component extraction

 

상수 반복자를 만들 수 있는데, const cv:: Mat 에 대한 참조를 받거나 반복문에서 cv:: Mat 인스턴스를 수정하지 않음을 의미할 경우 사용한다. 다음과 같이 선언한다.

CV:: MatConstIterator <CV:: Vec3b> it;

또는

CV:: Mat <CV:: Vec3b>:: const iterator it;

부연 설명

이번 예제에서 반복자의 시작 위치와 마지막 위치는 begin과 end 템플릿 메소드로 얻었다. 2장의 첫 번째 예제에서 했던 대로 cv:: Mat 인스턴스에 대한 참조자를 사용해 얻을 수 있었다. cv:: Mat 참조자를 생성할 때 이미 지정됐기 때문에 begin과 end 메소드에서 반복자 타입을 명시하는 경우를 피할 수 있다.

CV::Mat <cv::Vec3b> cimage= image;

CV:: Mat_<cv::Vec3b>::iterator it= cimage.begin(); CV::Mat_<cv::Vec3b>::iterator itend= cimage.end();

참고 사항

영상을 조회하기 위한 효율적인 반복문을 만드는 예제에서 영상을 조회할 때의 반복자 효율성을 다뤘다.

또한 객체지향 프로그래밍에서 반복자 개념과 ANSI C++에서 어떻게 구현됐는지에 대해 친숙하지 않는다면 STL 반복자에 대한 참고서를 읽어야 한다. 웹에서 'STL Iterator' 라는 키워드로 간단하게 검색하면 해당 주제에 대한 많은 참고 자료를 찾을 수 있다.

 

Handling pixel control method

허프 변환으로 영상 내 전 감지

인간이 만든 세상에서 평면과 선형 구조는 풍부하다. 이 결과로 영상 내 직선을 자주 볼 수 있다. 직선은 중요한 특징이며, 객체 인식과 영상 이해에 중요한 역할을 한다. 그러므로 영상 내의 특별한 특징을 감지하기 위해 사용한다. 허프 변환 Hough transform은 고전 알고리즘으로, 이런 목적을 달성한다. 처음에는 영상에서 선을 감지하기 위해 개발했고, 다른 간단한 영상 구조 감지로 확장할 수 있다.


허프 변환으로, 다음 방정식을 사용해 직선을 표현한다.

p= x cos 0+ y sin e

p 파라미터는 직선과 영상 원점(왼쪽 상단 모서리) 간의 거리이고, 9는 선에 대한 수직 각도다. 이 표현에서 영상 내에 보이는 선은 0과 Ⅱ 라디안 사이의 각도인 0를 갖고, p 반지름은 영상 대각선의 길이와 같은 최댓값을 갖는다. 예를 들어 다음 선 집합을 고려해보자.