Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Help #543

Closed
moyang628 opened this issue Feb 9, 2024 · 4 comments
Closed

Help #543

moyang628 opened this issue Feb 9, 2024 · 4 comments

Comments

@moyang628
Copy link

Hi,

I got a jpeg buff ,I want to convert it to opencv Mat for more image opration .

I have tried the Mat::from_raw 、Mat::new_rows_cols_with_data_def 、Mat::from_slice 、Mat::from_slice_rows_cols

it all got wrong,

now I have to save it as jpeg file and imread from it .

Is there a direct way to do that?

        let jpg_buff = std::slice::from_raw_parts(*p_data, (&*pst_frame_info).nFrameLen as usize);

        let mut file = File::create("camm.jpg").unwrap();
        let _ = file.write_all(jpg_buff);

        let mat = opencv::imgcodecs::imread_def("camm.jpg").unwrap();
        let _ = opencv::highgui::imshow("code jpeg", &mat);
        let _ = wait_key(0);
        let _ = destroy_all_windows();

@twistedfall
Copy link
Owner

twistedfall commented Feb 9, 2024

You should use the imdecode function, but first convert the slice to Vector<u8> by calling Vector::<u8>::from_slice(jpeg_buff). If you want to avoid copying the buffer and don't mind a little bit of unsafe then instead of Vector you can use Mat:

unsafe { Mat::new_rows_cols_with_data_def(1, jpg_buff.len() as i32, u8::opencv_type(), jpg_buff.as_mut_ptr().cast::<c_void>()) }

Just make sure that you drop this Mat before you drop the jpeg_buff.

@moyang628
Copy link
Author

thanks.

converting the slice to Vector by calling Vector::::from_slice(jpeg_buff) works

but the new_rows_cols_with_data_def dont work.
the

  unsafe { Mat::new_rows_cols_with_data_def(1, jpg_buff.len() as i32, u8::opencv_type(), jpg_buff.as_mut_ptr().cast::<c_void>()) }

You should use the imdecode function, but first convert the slice to Vector<u8> by calling Vector::<u8>::from_slice(jpeg_buff). If you want to avoid copying the buffer and don't mind a little bit of unsafe then instead of Vector you can use Mat:

unsafe { Mat::new_rows_cols_with_data_def(1, jpg_buff.len() as i32, u8::opencv_type(), jpg_buff.as_mut_ptr().cast::<c_void>()) }

Just make sure that you drop this Mat before you drop the jpeg_buff.

@twistedfall
Copy link
Owner

When you say it doesn't work what kind of error are you getting?

@twistedfall
Copy link
Owner

I'm going to close this for now with the hope that you made it work, but feel free to reopen and supply additional details if it's not the case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants