연산자 유형 및 동기화에 대한 실용적인 지침은 Operator Types and Synchronization 튜토리얼 항목을 참조하십시오.
VisualApplets의 강력한 기능 중 하나는 서로 다른 카메라 소스의 이미지를 결합하는 것입니다. 다음에서는 다음을 수행하는 방법을 배웁니다.
- 카메라 소스 간 전환
- 두 카메라의 이미지 오버레이
- 카메라 이미지 멀티플렉싱
- 두 카메라의 이미지 스티칭
두 카메라 간에 전환하려면 두 개의 카메라 모듈이 포함된 간단한 디자인이 필요합니다. VisualApplets에서 SourceSelector 오퍼레이터('SourceSelector' 참조)를 사용하여 두 비동기 소스 간에 전환할 수 있습니다. 이 오퍼레이터를 사용하면 다른 입력의 데이터가 무시되는 동안 여러 입력 중 하나를 선택할 수 있습니다. 입력 중 하나가 선택되면 다른 입력은 Trash 오퍼레이터에 연결된 것처럼 동작합니다. 취득이 실행되는 동안 입력을 전환하는 것이 가능합니다. 오퍼레이터는 새 프레임이 시작될 때 전환됩니다. 두 입력의 프레임 레이트와 이미지 크기가 동일할 필요는 없습니다.
다음으로, 두 카메라의 이미지 데이터를 결합하는 방법을 살펴보겠습니다. 예제에서는 오버레이 블렌드를 사용하여 두 이미지를 결합합니다.
예제에 대한 사양은 다음과 같습니다.
-
기본 오퍼레이터
다음 그림과 같이 디자인의 기본 오퍼레이터부터 시작합니다. 모든 기본 파라미터와 링크 Property를 사용할 수 있습니다.
-
동기화
다음으로 두 카메라의 데이터 스트림을 동기화해야 합니다. 이는 SYNC 오퍼레이터를 사용하여 간단하게 수행할 수 있습니다. SYNC 오퍼레이터는 출력들이 완전히 동기화되도록 입력을 제어합니다. 보시다시피 동기화 전에 두 개의 버퍼 모듈을 사용했습니다. 두 카메라가 100% 동기화된다고 보장할 수 없으므로 이들을 사용해야 합니다.
이미지 데이터를 동기화했음에도 불구하고 여전히 몇 가지 제약 사항에 주의해야 합니다.
-
두 카메라의 프레임 수, 즉 프레임 레이트가 동일해야 합니다. 한 카메라의 프레임 레이트가 다른 카메라보다 높으면 ImageBuffer 모듈 중 하나가 일부 이미지를 저장해야 하므로 오버플로 상태가 발생할 수 있습니다. 따라서 장시간 취득의 경우 두 카메라 모두 동일한 프레임 레이트를 사용하여 프레임을 취득해야 합니다. 트리거 시스템을 통해 이를 보장할 수 있습니다.
- 두 카메라 ROI의 이미지 크기와 이미지 위치는 다를 수 있습니다. SYNC 오퍼레이터는 파라미터 설정에 따라 자동으로 더 작은 이미지를 더 큰 이미지로 확장하거나 더 큰 이미지를 자릅니다. 자세한 내용은 SYNC 오퍼레이터 설명을 참조하세요: ('SYNC')
-
-
오버레이 블렌드
마지막 단계는 두 이미지를 결합하기 위해 오버레이 블렌드를 구현하는 것입니다. 편의를 위해 오버레이 블렌드 구현에 계층적 상자(hierarchical box)를 사용합니다.
오버레이 블렌드는 모든 색상 성분에 개별적으로 적용되어야 합니다. 따라서 링크를 세 가지 색상 성분 모두로 분할해야 합니다. 오버레이 블렌드는 다시 한번 계층적 상자 내부에 배치됩니다. 결과적으로 현재 계층적 상자 내부에 세 개의 계층적 상자가 있게 됩니다. 복사 및 붙여넣기를 사용하여 각 색상 성분에 대한 상자를 복제할 수 있습니다.
We will have varying possibilities to realize the equation given above using VisualApplets operators. In general, you should always try to adapt and optimize an equation for FPGA use before implementing it.
방정식에는 상숫값을 사용하는 일부 곱셈과 나눗셈이 포함됩니다. 이러한 연산은 VisualApplets에서 사용할 수 있지만 FPGA에서 매우 효율적으로 구현되지는 않습니다. 곱셈이나 나눗셈을 2의 거듭제곱 곱셈으로 작성할 수 있는 경우 구현을 위해 간단한 비트 시프트를 사용할 수 있습니다. 비트 시프트는 리소스를 전혀 필요로 하지 않습니다! 우리는 단순화할 것입니다

(으)로

즉, 이는 7비트 오른쪽 시프트이며, 하위 7비트를 버리는 것을 의미합니다.

다음으로, 방정식에는 255에서 ColorA를 뺀 값과 같은 부분들이 있습니다. 이것은 단순한 색상 반전입니다. 흰색은 어둡게, 어두운 부분은 밝게 바뀝니다. 값의 반전은 각 비트를 간단히 반전하는 방식으로도 수행할 수 있습니다. 이를 통해 최종적으로 방정식을 다음과 같이 다시 작성할 수 있습니다:
이제 구현을 시작할 수 있습니다. 방정식의 나머지 연산들은 VisualApplets 오퍼레이터로 제공됩니다. 다음 항목들이 필요합니다:
-
IF
-
반전을 위한 NOT
-
2^7로 나누기 위한 ShiftRight
-
곱셈을 위한 HWMULT
HWMULT 외에도 VisualApplets에는 MULT 오퍼레이터가 포함되어 있습니다. 이 둘은 동일한 작업을 수행하지만, HWMULT는 FPGA의 전용 승산기를 사용하므로 훨씬 적은 리소스가 필요합니다.
-
비트 심도 제한을 위해 CastBitWidth 오퍼레이터가 필요합니다. 이 오퍼레이터를 사용하면 MSB를 버려 9비트에서 8비트로 전환할 수 있습니다. 공식에서 알 수 있듯이 255보다 큰 값은 존재하지 않습니다.
-
-
시뮬레이션을 통한 검증
-
VisualApplets 시뮬레이션을 사용하여 오버레이 블렌드의 기능을 쉽게 검증할 수 있습니다. 두 개의 시뮬레이션 소스를 사용하여 두 카메라 모두에 이미지를 주입합니다. 원하는 링크에 시뮬레이션 프로브를 배치합니다. 시뮬레이션 결과는 두 이미지의 오버레이를 보여줍니다. 관심이 있는 경우 계층형 상자에서 오버레이의 중간 결과도 확인할 수 있습니다.

- 시뮬레이션은 타이밍이 아닌 앱릿의 기능적 부분만 반영하므로, 시뮬레이션으로는 동기화를 검증할 수 없습니다. 하드웨어에서의 검증이 필요합니다.
-
-
트리거 추가
앞서 언급했듯이 버퍼 중 하나에서 오버플로가 발생하는 것을 방지하려면 두 카메라가 동일한 프레임 레이트로 작동해야 합니다. 이는 트리거 시스템을 사용하여 쉽게 해결할 수 있습니다.
VisualApplets에서 이미지나 라인을 멀티플렉싱하는 것은 매우 쉽습니다. 두 카메라의 이미지를 멀티플렉싱하는 예제부터 시작하겠습니다. i.e. 카메라 A와 카메라 B의 이미지를 번갈아 출력하기 위해 동일한 DMA 채널을 사용하고자 합니다.
-
기본 오퍼레이터
두 개의 카메라 모듈, 두 개의 버퍼, 하나의 DMA를 사용하는 두 카메라용 표준 디자인이 필요합니다.

-
이미지 멀티플렉싱
이미지를 멀티플렉싱하기 위해 InsertImage 오퍼레이터를 사용합니다. 이 오퍼레이터는 입력된 이미지를 차례대로 전달합니다. 예를 들어 두 개의 입력을 사용하는 경우, 오퍼레이터는 입력 0, 1, 0, 1, 0, 1, ... 순으로 이미지를 전달합니다. 따라서 하나의 입력이 처리된 후 다음 입력이 사용됩니다. 그러므로 두 입력의 프레임 수가 같아야 하며, 즉 입력들이 동일한 프레임 레이트를 가져야 합니다.

보시다시피 이미지 삽입 전에 이미지 버퍼 모듈을 배치했습니다. 이는 InsertImage 오퍼레이터 자체에는 버퍼가 없기 때문입니다. 입력 0의 이미지가 전달되는 동안 입력 1은 차단되므로 데이터 손실을 방지하기 위해 카메라 이미지를 버퍼링해야 합니다.
각 입력(I0, I1, ...)에 대해 오퍼레이터는 Ins0, Ins1, ...이라는 두 번째 입력을 제공합니다. 이 입력은 이미지를 사용할지 또는 버릴지 제어하는 제어 입력입니다. 따라서 Ins 입력에 값 0이 있으면 입력을 건너뛸 수 있고, 값 1이 제공되면 사용됩니다. 입력 그룹 I와 Ins는 동기화되어야 하며, 즉 O형 오퍼레이터의 임의 네트워크를 통해 동일한 M형 오퍼레이터로부터 소스를 제공받아야 합니다. 자세한 내용은 'Operator Types'를 참조하십시오. 두 입력이 동기화되므로 동일한 이미지 크기를 가져야 합니다. InsertImage는 Ins 입력의 첫 번째 픽셀을 사용하여 이미지 사용 여부를 결정합니다. 이전 스크린샷에서 볼 수 있듯이 이미지 사용을 활성화하기 위해 단순히 CONST 오퍼레이터를 사용했습니다. 삽입을 활성화하려면 CONST 오퍼레이터의 출력 링크 비트 심도를 1비트로 설정하고 "Value" 파라미터를 1로 설정하십시오.
참고: Ins 입력 중 하나의 값이 0인 경우에도 오퍼레이터는 해당 입력의 이미지를 계속 처리해야 합니다. 값이 0이라고 해서 이미지를 제공할 필요가 없다는 의미는 아닙니다. 입력에 이미지가 제공되지 않으면 오퍼레이터는 이미지를 사용할 수 있을 때까지 대기합니다.
언급했듯이 한 번에 하나의 페어 입력만 열리고 나머지는 차단됩니다. 이미지는 서로 다른 버퍼 등에서 비동기적으로 소스를 가져와야 합니다. 다음 그림에서는 작동하지 않는 두 가지 구성을 볼 수 있습니다. 앱릿이 자체적으로 차단되므로 어떠한 결과도 얻을 수 없습니다. 이를 "교착 상태(deadlock)" 조건이라고 합니다.
다른 입력이 활성화되어 있는 동안 중지된 입력 중 하나를 버퍼링할 수 있는지 항상 확인하십시오. 교착 상태 상황은 DRC나 시뮬레이션으로 감지할 수 없다는 점을 잊지 마십시오. 교착 상태에 대한 자세한 내용은 'Timing Synchronization'에서 확인할 수 있습니다.
이전 섹션에서는 두 대의 카메라 이미지를 멀티플렉싱했습니다. 스티칭(Stitching)도 거의 동일한 방식으로 수행됩니다. 대신 InsertLine 오퍼레이터를 사용하며, AppendLine 오퍼레이터를 사용하여 연속된 두 라인을 추가해야 합니다.

InsertLine은 먼저 두 입력의 라인을 멀티플렉싱한 다음, 두 라인을 추가해야 합니다.
물론 앞선 두 예제에서도 동일한 이미지 소스를 사용할 수 있습니다. 여기서 주의해야 할 점은 삽입 작업 전에 충분한 버퍼가 확보되어야 한다는 것입니다. 이미지를 삽입하려면 전체 이미지를 버퍼링해야 합니다. 라인을 복제하려면, 한쪽 경로에서 동일한 라인이 처리되는 동안 해당 라인 중 하나만 버퍼링하면 됩니다. 소수의 라인만 버퍼링하려면 ImageFifo 오퍼레이터를 사용할 수 있습니다. 이 오퍼레이터는 프레임 그래버 DRAM Memory를 사용하지 않습니다. 대신 FPGA 내부 BlockRAM Memory를 사용합니다. FIFO는 최대 한 라인을 저장하도록 구성합니다. 다음 예제에서는 이미지 라인을 복제했으며, 복제된 라인은 반전됩니다. 따라서 결과는 왼쪽에 원본 이미지, 오른쪽에 반전된(네거티브) 버전이 됩니다.






이전

