opencv 비디오 파일의 영상 표시(rust/macos)

2024. 8. 28. 13:09프로그래밍/Rust

rust와 opencv를 사용하여 MacOS에서 영상 프레임을 추출하여 화면에 표시하는 예제입니다.

 

MacOS에서 opencv 개발 환경을 구성하는 방법부터 차례로 설명하겠습니다.
이 게시물에서 부족한 내용은 아래의 문서를 참고하시기 바랍니다.

 

opencv-rust/INSTALL.md at master · twistedfall/opencv-rust (github.com)

 

opencv-rust/INSTALL.md at master · twistedfall/opencv-rust

Rust bindings for OpenCV 3 & 4. Contribute to twistedfall/opencv-rust development by creating an account on GitHub.

github.com

 

 

1. 개발 환경 구성

 

1.1. homebrew를 사용하여 opencv를 설치합니다.

brew install opencv

 

 

1.2. homebrew를 사용하여 llvm을 설치합니다.

brew install llvm

 

 

1.3. export 명령을 실행합니다.

export DYLD_FALLBACK_LIBRARY_PATH="$(xcode-select --print-path)/Toolchains/XcodeDefault.xctoolchain/usr/lib/"
export LDFLAGS=-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib

 

 

 

2. opencv-rust 프로젝트 시작

 

2.1. 프로젝트 생성

cargo new opencv_test

 

2.2. Cargo.toml 수정

Windows와 MacOS에서의 의존성 설정이 다르기 때문에 'cargo add'를 사용하지 않고 직접 Cargo.toml 파일에 아래와 같은 코드를 넣습니다.

[target.'cfg(target_os = "macos")'.dependencies]
opencv = { version = "0.92.2", features = ["clang-runtime"] }

[target.'cfg(target_os = "windows")'.dependencies]
opencv = { version = "0.92.2" }

 

 

2.3. 샘플 영상 추가

프로젝트 루트 폴더에 asset/video 폴더를 추가하고 테스트에 사용할 영상을 넣어준 뒤 파일 이름을 test.mp4로 변경해줍니다.

 

 

2.4. 영상 재생 코드

아래의 코드는 비디오 파일로부터 한 프레임씩을 읽어들여서 화면에 표시하는 예제입니다.

use opencv::{
    core, highgui,
    videoio::{self, VideoCaptureTrait},
    Result,
};

pub struct VideoSource {
    pub video_source: videoio::VideoCapture,
}

impl VideoSource {
    pub fn new(video_file_name: String) -> Result<VideoSource, String> {
        if let Ok(video_source) =
            videoio::VideoCapture::from_file(&video_file_name, videoio::CAP_ANY)
        {
            Ok(VideoSource { video_source })
        } else {
            Err(format!("Can't open video file: {}", video_file_name))
        }
    }

    pub fn read(&mut self) -> Result<core::Mat, String> {
        let mut frame = core::Mat::default();
        if let Ok(result) = self.video_source.read(&mut frame) {
            if result {
                Ok(frame)
            } else {
                Err("Can't read frame".to_string())
            }
        } else {
            Err("Can't read frame".to_string())
        }
    }
}

fn main() -> Result<()> {
    let window = "video capture";
    highgui::named_window(window, highgui::WINDOW_AUTOSIZE)?;
    let mut video_source = VideoSource::new("./asset/video/test.mp4".to_string()).unwrap();
    loop {
        if let Ok(frame) = video_source.read() {
            highgui::imshow(window, &frame)?;
        }

        let key = highgui::wait_key(10)?;
        if key > 0 && key != 255 {
            break;
        }
    }

    highgui::destroy_window(window)?;
    Ok(())
}

 

 

2.5. 실행

cargo run

 

 

 

끝.

 

 

 

사업자 정보 표시
주식회사 셀엑손 (CELLAXON Inc. | 이상효 | 경기도 화성시 동탄감배산로 143, 202동 2409호 | 사업자 등록번호 : 304-81-34245 | TEL : 031-8043-3215 | Mail : ryan@cellaxon.com | 통신판매신고번호 : 2022-화성동탄-0844호 | 사이버몰의 이용약관 바로가기

'프로그래밍 > Rust' 카테고리의 다른 글

opencv with rust in windows  (0) 2024.08.27
Rust / 문자열 입력  (0) 2022.12.29
Rust / "Hello World"  (0) 2022.12.29
Rust / 러스트 설치하기  (0) 2022.12.29