C++ 12

SSIM 함수 (Structural Similarity Index Map)

img1, img2 가 있을 때, 두 영상의 유사도 비교하여 0~1 사이 값으로 반환해 주는 함수.// SSIM 계산 및 차이맵 반환 함수double calculateSSIM(const Mat& img1, const Mat& img2, Mat& ssim_map) {const double C1 = 6.5025, C2 = 58.5225;Mat img1_64F, img2_64F;img1.convertTo(img1_64F, CV_64F);img2.convertTo(img2_64F, CV_64F);// 평균값(Mean) 계산Mat mu1, mu2;GaussianBlur(img1_64F, mu1, Size(11, 11), 1.5);GaussianBlur(img2_64F, mu2, Size(11, 11), 1.5);..

C++ 2025.03.17

C++ 소멸자에 virtual을 사용하는 이유

virtual 소멸자를 사용하면 다형성을 올바르게 처리할 수 있습니다. 부모 클래스의 포인터를 통해 자식 클래스의 객체를 삭제할 때, 자식 클래스의 소멸자도 호출되어 자원 해제가 올바르게 이루어집니다. 그렇지 않으면 자식 클래스에서 할당한 리소스를 해제하지 못할 수 있습니다. 따라서, 클래스를 상속할 계획이 있는 경우, 특히 동적 메모리를 사용하는 경우 소멸자는 반드시 virtual로 선언해야 합니다.

C++ 2024.12.15

C++ virtual 내부 작동 방식

C++ 에서 클래스를 컴파일하면 그 클래스의 모든 메서드를 담은 바이너리 객체가 생성됩니다. 이 때, virtual로 선언되지 않은 메서드를 호출하는 부분을 컴파일 시간에 결정된 타입의 코드로 교체합니다. 이를 정적 바인딩(static binding) 또는 이른 바인딩(early binding)이라 부릅니다. 메서드를 virtual로 선언하면 vtable(가상 테이블)이라 부르는 특수한 메모리 영역을 활용해서 가장 적합한 구현 코드를 호출합니다. virtual 메서드가 하나 이상 정의된 클래스마다 vtable이 존재하는데, 이 클래스로 생성된 객체마다 vtable에 대한 포인터를 갖게 됩니다. virtual 메서드의 구현 코드에 대한 포인터는 바로 이 vtable에 담겨 있습니다. 그래서 객체에 대해 메..

C++ 2024.12.14

register c++

register 란목적: 변수의 사용 빈도가 높을 때 해당 변수를 CPU 레지스터에 저장하도록 컴파일러에 힌트를 주기 위한 키워드였습니다. CPU 레지스터는 메모리보다 훨씬 빠르게 접근할 수 있기 때문입니다.특징:속도 최적화: 변수의 접근 속도를 높이기 위해 설계된 키워드입니다.주소를 취할 수 없음: register 변수는 메모리에 저장되지 않을 수 있으므로, 주소를 취할 수 없습니다(& 연산자 사용 불가).현대 C++에서 비추천: 최신 컴파일러는 이미 고급 최적화를 수행하며, register 키워드의 사용을 무시합니다.C++17에서는 사용이 더 이상 권장되지 않으며(deprecated),C++20에서는 완전히 제거되었습니다.

C++ 2024.12.13

Intel Intrinsics SIMD

**인텔 SIMD(Single Instruction, Multiple Data)**는 Intel 프로세서에서 지원하는 병렬 연산 기술로, 하나의 명령어를 사용하여 여러 데이터 요소를 동시에 처리하는 방식입니다. SIMD는 데이터 병렬성을 활용하여 벡터화(vectorization)를 통해 성능을 크게 향상시키는 데 사용 가이드 : https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html Intel® Intrinsics GuideIntel® Intrinsics Guide includes C-style functions that provide access to other instructions without writing assembly..

C++ 2024.12.10

OpenMP 란

영상 병렬 처리에 사용. OpenMP(Open Multi-Processing)는 공유 메모리 병렬 프로그래밍을 위한 API(Application Programming Interface)로, C, C++, Fortran과 같은 언어에서 다중 프로세서 환경에서 병렬 처리를 지원합니다. OpenMP는 컴파일러 지시문, 라이브러리 함수, 환경 변수를 통해 병렬 처리를 구현하며, 주로 멀티코어 CPU 환경에서 성능을 최적화하는 데 사용. #include #include int main() { int sum = 0; int n = 10; #pragma omp parallel for reduction(+:sum) for (int i = 1; i

C++ 2024.12.10

ZeroMQ 란

ZeroMQ(또는 ØMQ)는 고성능 비동기 메시징 라이브러리로, 분산 애플리케이션에서 통신을 간단하고 빠르게 설정할 수 있게 해줍니다. ZeroMQ는 소켓을 이용해 데이터를 송수신하며, 네트워크 프로토콜을 직접 처리하지 않고도 효율적인 메시징 시스템을 구축할 수 있도록 설계되었습니다.주요 특징고성능:ZeroMQ는 매우 빠르고 경량화된 메시징 라이브러리입니다.네트워크 지연을 최소화하고 대량의 데이터를 효율적으로 처리할 수 있습니다.소켓 추상화:TCP/IP, UDP, IPC(Inter-process communication) 등 다양한 프로토콜을 지원합니다.소켓은 REQ-REP, PUB-SUB, PUSH-PULL 등 다양한 패턴으로 사용 가능합니다.유연성:P2P, 클라이언트-서버, 브로커리스 메시징, 게시-..

C++ 2024.12.10

콘솔 컬러로 출력하도록 하는 함수

#include  // Console 컬러 설정하는 함수 // 색상 코드: // 0 = 검정, 1 = 파랑, 2 = 초록, 3 = 청록, 4 = 빨강, 5 = 자주, 6 = 노랑, 7 = 흰색 void setConsoleColor(int textColor, int bgColor = 0)  { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, (bgColor } int main() { setConsoleColor(2); std::cout setConsoleColor(4); std::cout setConsoleColor(7); std::cout  return 0;}

C++ 2024.12.09