簡體   English   中英

如何使用 BGR2HSV 和 opencv:highgui::create_trackbar 在 Rust 中使用 OpenCV 實現 HSV slider

[英]How to implement HSV slider with OpenCV using BGR2HSV and opencv:highgui::create_trackbar in Rust

請耐心等待,因為這是我的第一篇關於堆棧溢出的文章。

我正在嘗試在 OpenCV 到 python 中學習具有相當初級背景的 rust。

在我原來的 python 腳本中,我可以很容易地使用 createTrackbar() 但在轉換為 rust 時,我無法理解如何使用 Rust OpenCV 文檔中的“value”和“ on_change ”參數

pub fn create_trackbar(
    trackbarname: &str,
    winname: &str,
    value: Option<&mut i32>,
    count: i32,
    on_change: TrackbarCallback
) -> Result<i32>

我的最終目標是然后使用 opencv::highgui::get_trackbar_pos 來控制色相最大值和最小值、飽和度最大值和最小值以及值最大值和最小值,就像我在下面的 python 示例中所做的那樣:

while True:

    cv2.namedWindow("HSV")
    cv2.resizeWindow("HSV",640,480)
    cv2.createTrackbar("HUE MIN","HSV",0,179,empty)
    cv2.createTrackbar("HUE MAX","HSV",0,179,empty)
    cv2.createTrackbar("SAT MIN","HSV",0,255,empty)
    cv2.createTrackbar("SAT MAX","HSV",0,255,empty)
    cv2.createTrackbar("VAL MIN","HSV",0,255,empty)
    cv2.createTrackbar("VAL MAX","HSV",0,255,empty)

    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret==True:
            
            hsvframe = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

            h_min = cv2.getTrackbarPos("HUE MIN","HSV")
            h_max = cv2.getTrackbarPos("HUE MAX","HSV")
            s_min = cv2.getTrackbarPos("SAT MIN","HSV")
            s_max = cv2.getTrackbarPos("SAT MAX","HSV")
            v_min = cv2.getTrackbarPos("VAL MIN","HSV")
            v_max = cv2.getTrackbarPos("VAL MAX","HSV")
        

            lower = np.array([h_min,s_min,v_min])
            upper = np.array([h_max,s_max,v_max])
            mask = cv2.inRange(hsvframe,lower,upper)
            result = cv2.bitwise_and(frame,frame,mask=mask)

            print(lower,upper)

            out.write(mask)
            cv2.imshow('mask',mask)
            pass
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break

我知道軌跡欄名稱將是我自己選擇的字符串,winname 是我創建的 hsv window,我知道計數是 179,因為我想要從 0 到 179 的 180 個值,但不太了解 Option 和 TrackbarCallback 是什么應該放在 as.

下面是我的代碼。


use opencv::{ highgui::{self, WINDOW_AUTOSIZE}, imgproc, prelude::*, videoio, Result};

fn run() -> Result<()> {

    let window = "video capture";
    let hsv = "HSV";

    
    highgui::named_window(window, 1)?;
    
    highgui::named_window(hsv, WINDOW_AUTOSIZE)?;
    highgui::create_trackbar("HUE MAX", hsv, )?;
    highgui::create_trackbar("HUE MIN", hsv, )?;

    opencv::opencv_branch_32! {
        let mut cam = videoio::VideoCapture::new_default(0)?; // 0 is the default camera
    }
    opencv::not_opencv_branch_32! {
        let mut cam = videoio::VideoCapture::new(0, videoio::CAP_ANY)?; // 0 is the default camera
    }
    let opened = videoio::VideoCapture::is_opened(&cam)?;
    if !opened {
        panic!("Unable to open default camera!");
    }

    loop {
        let mut frame = Mat::default();
        cam.read(&mut frame)?;
        if frame.size()?.width > 0 {
            let mut gray = Mat::default();
            imgproc::cvt_color(&frame, &mut gray, imgproc::COLOR_BGR2HSV, 0)?;
            highgui::imshow(window, &gray)?;
        }
        if highgui::wait_key(10)? > 0 {
            break;
        }
    }
    Ok(())

}

fn main() {

    run().unwrap()

}


據我所知,Option 似乎是一個任意的開始 position 所以我認為 i32 = 0 可以工作但我不確定,然后在瀏覽TrackbarCallback 文檔時我不確定我是否應該輸入這個詞“位置”

我確定答案很簡單,但請理解我的曝光率非常有限,我正在盡我所能學習盡可能多的知識,而不會太快不知所措。

如果您打算使用get_trackbar_pos讀取值,那么您可以將None用於valueon_change

在 C/C++ 中, value旨在成為一個變量,其中 OpenCV 每次更改時寫入該值,以便您可以讀取它而不是調用get_trackbar_pos 不確定它是如何轉換為 Rust 的,因為在 OpenCV 中存在對它的可變引用使得在其他地方讀取它成為未定義的行為。

on_change旨在成為一個 function 的地址,當值發生變化時 OpenCV 將調用該地址,以便您可以立即處理更改。 如果您使用get_trackbar_pos讀取值,則不需要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM