Gamma Correction

이 튜토리얼은 구성 가능한 감마 보정으로 2D 이미지를 캡처하는 방법을 보여줍니다.

먼저 카메라에 연결합니다.

소스로 이동

소스

auto camera = zivid.connectCamera();
소스로 이동

소스

camera = app.connect_camera()

그런 다음 사용자로부터 명령줄 인수로 감마를 얻습니다.

소스로 이동

소스

const double gamma = readGamma(argc, argv);
std::cout << "Capturing with gamma correction: " << gamma << std::endl;
소스로 이동

소스

user_options = _options()
print(f"Capturing with gamma correction: {user_options.gamma}")

그런 다음 감마 보정 없이(감마 = 1.0) 주어진 감마 보정(이 경우 감마 = 0.6)으로 이미지를 캡처합니다.

소스로 이동

소스

cv::Mat bgraOriginal = captureBGRAImage(camera, 1.0);
cv::Mat bgraAdjusted = captureBGRAImage(camera, gamma);
소스로 이동

소스

bgr_original = _capture_bgr_image(camera, 1.0)
bgr_adjusted = _capture_bgr_image(camera, user_options.gamma)

컬러 이미지를 캡처하는 기능의 구현은 다음과 같습니다.

소스로 이동

소스

cv::Mat captureBGRAImage(Zivid::Camera &camera, const double gamma)
{
    std::cout << "Configuring settings" << std::endl;
    const auto settings2D = Zivid::Settings2D{ Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{} },
                                               Zivid::Settings2D::Processing::Color::Gamma{ gamma } };

    std::cout << "Capturing 2D frame" << std::endl;
    const auto frame2D = camera.capture(settings2D);
    const auto image = frame2D.imageBGRA();

    auto imageDataPointer = const_cast<void *>(static_cast<const void *>(image.data()));

    cv::Mat bgra = cv::Mat(image.height(), image.width(), CV_8UC4, imageDataPointer).clone();

    return bgra;
}
소스로 이동

소스

def _capture_bgr_image(camera: zivid.Camera, gamma: float) -> np.ndarray:
    """Capture and extract 2D image, then convert from RGBA and return BGR.

    Args:
        camera: Zivid Camera handle
        gamma: Gamma correction value

    Returns:
        bgr: BGR image (HxWx3 ndarray)

    """
    print("Configuring Settings")
    settings_2d = zivid.Settings2D(
        acquisitions=[zivid.Settings2D.Acquisition()],
    )
    settings_2d.processing.color.gamma = gamma

    print("Capturing 2D frame")
    with camera.capture(settings_2d) as frame_2d:
        image = frame_2d.image_bgra()
        bgra = image.copy_data()
        return bgra[:, :, :3]

감마 보정이 있는 이미지와 없는 이미지를 비교하기 위해 결합된 이미지가 생성되고 표시됩니다.

소스로 이동

소스

cv::Mat combineImages(const cv::Mat &imageOne, const cv::Mat &imageTwo)
{
    cv::Mat combinedImage;
    int height = imageOne.rows;
    int width = imageOne.cols;
    cv::hconcat(
        imageOne(cv::Range(0, height), cv::Range(0, width / 2)),
        imageTwo(cv::Range(0, height), cv::Range(width / 2, width)),
        combinedImage);

    return combinedImage;
}
소스로 이동

소스

def _combine_images(image_one: np.ndarray, image_two: np.ndarray) -> np.ndarray:
    """Column-wise concatenate each half of two images together as one.

    Args:
        image_one: Left side of concatenated image
        image_two: Right side of concatenated image

    Returns:
        combined_image: Combined halves of each image

    """
    width = (int)(image_one.shape[1] / 2)
    combined_image = np.hstack([image_one[:, :width], image_two[:, -width:]])

    return combined_image

결과적으로 결합된 이미지는 왼쪽에 원래 절반이 있고 오른쪽에 감마 보정된 절반이 있는 아래에 표시됩니다.

소스로 이동

소스

std::cout << "Displaying color image before and after gamma correction: " << gamma << std::endl;
cv::Mat combinedImage = combineImages(bgraOriginal, bgraAdjusted);
displayBGRA(combinedImage, "Original on left, adjusted on right");
소스로 이동

소스

print(f"Displaying color image before and after gamma correction: {user_options.gamma}")
combined_image = _combine_images(bgr_original, bgr_adjusted)
cv2.imwrite("combined_image.jpg", combined_image)
display_bgr(combined_image[:, :, 0:3], title="Original on left, adjusted on right")

감마 보정: 왼쪽이 원본, 오른쪽이 조정 후