使用 opencv-rust 做翻转
use opencv-rust to do flip
我是opencv的新手,只是设法遵循opencv-rust api,编写这些代码来做翻转,但不知何故不起作用。有什么建议吗?
Cargo.toml
[package]
name = "op"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
opencv = "0.62"
bytes = "1"
anyhow = "1"
main.rs
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
prelude::*,
};
use bytes::Bytes;
fn main() -> Result<()> {
let data = include_bytes!("../rust-logo.png");
let src = Mat::from_slice::<u8>(data.as_ref())?;
let dest = imgcodecs::imdecode(&src, imgcodecs::IMREAD_COLOR);
//flip
let mut dest = Mat::default();
core::flip(&src, &mut dest, 0);
let mut params: Vector<i32> = Vector::new();
params.push(imgcodecs::ImwriteFlags::IMWRITE_JPEG_QUALITY as i32);
imgcodecs::imwrite(&"rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}
到运行代码,先安装opencv llvm
,例如。 brew install opencv llvm
;导出环境路径export DYLD_FALLBACK_LIBRARY_PATH="$(xcode-select --print-path)/usr/lib/"
正如评论中已经提到的,您隐藏了第一个 dest
变量。除此之外 imgcodecs::imdecode()
returns 结果,您必须先打开包装。
这是您的代码版本,只需少量改动即可使其正常工作:
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
};
fn main() -> Result<()> {
let data = include_bytes!("../rust-logo.png");
let src = Mat::from_slice::<u8>(data.as_ref())?;
let src_decoded = imgcodecs::imdecode(&src, imgcodecs::IMREAD_COLOR)?;
//flip
let mut dest = Mat::default();
core::flip(&src_decoded, &mut dest, 0)?;
let mut params: Vector<i32> = Vector::new();
params.push(imgcodecs::ImwriteFlags::IMWRITE_JPEG_QUALITY as i32);
imgcodecs::imwrite(&"rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}
但是有一个问题。如果您使用生锈徽标,它可能会在透明背景上显示黑色徽标。如果您像现在一样写入没有透明度的 PNG,这将导致全黑图像。然而这与翻转操作无关,这只是一些可能不直观的行为。
出于这个原因,我建议翻转图像,如下所示:
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
};
fn main() -> Result<()> {
let src_decoded = imgcodecs::imread("rust-logo.png", imgcodecs::IMREAD_UNCHANGED)?;
// Flip image
let mut dest = Mat::default();
core::flip(&src_decoded, &mut dest, 0)?;
let params: Vector<i32> = Vector::new();
imgcodecs::imwrite("rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}
我是opencv的新手,只是设法遵循opencv-rust api,编写这些代码来做翻转,但不知何故不起作用。有什么建议吗?
Cargo.toml
[package]
name = "op"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
opencv = "0.62"
bytes = "1"
anyhow = "1"
main.rs
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
prelude::*,
};
use bytes::Bytes;
fn main() -> Result<()> {
let data = include_bytes!("../rust-logo.png");
let src = Mat::from_slice::<u8>(data.as_ref())?;
let dest = imgcodecs::imdecode(&src, imgcodecs::IMREAD_COLOR);
//flip
let mut dest = Mat::default();
core::flip(&src, &mut dest, 0);
let mut params: Vector<i32> = Vector::new();
params.push(imgcodecs::ImwriteFlags::IMWRITE_JPEG_QUALITY as i32);
imgcodecs::imwrite(&"rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}
到运行代码,先安装opencv llvm
,例如。 brew install opencv llvm
;导出环境路径export DYLD_FALLBACK_LIBRARY_PATH="$(xcode-select --print-path)/usr/lib/"
正如评论中已经提到的,您隐藏了第一个 dest
变量。除此之外 imgcodecs::imdecode()
returns 结果,您必须先打开包装。
这是您的代码版本,只需少量改动即可使其正常工作:
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
};
fn main() -> Result<()> {
let data = include_bytes!("../rust-logo.png");
let src = Mat::from_slice::<u8>(data.as_ref())?;
let src_decoded = imgcodecs::imdecode(&src, imgcodecs::IMREAD_COLOR)?;
//flip
let mut dest = Mat::default();
core::flip(&src_decoded, &mut dest, 0)?;
let mut params: Vector<i32> = Vector::new();
params.push(imgcodecs::ImwriteFlags::IMWRITE_JPEG_QUALITY as i32);
imgcodecs::imwrite(&"rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}
但是有一个问题。如果您使用生锈徽标,它可能会在透明背景上显示黑色徽标。如果您像现在一样写入没有透明度的 PNG,这将导致全黑图像。然而这与翻转操作无关,这只是一些可能不直观的行为。
出于这个原因,我建议翻转图像,如下所示:
use anyhow::Result;
use opencv::{
core::{self, Mat, Vector},
imgcodecs,
};
fn main() -> Result<()> {
let src_decoded = imgcodecs::imread("rust-logo.png", imgcodecs::IMREAD_UNCHANGED)?;
// Flip image
let mut dest = Mat::default();
core::flip(&src_decoded, &mut dest, 0)?;
let params: Vector<i32> = Vector::new();
imgcodecs::imwrite("rust-logo-flip.png", &dest, ¶ms)?;
Ok(())
}