使用 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, &params)?;
    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, &params)?;
    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, &params)?;
    Ok(())
}