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)
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 |