Load hình ảnh camera

Em đang làm 1 dự án opencv nhận hình ảnh từ camera đưa lên winform VC++ dùng picturebox nhưng nó không load lên được mong mọi người chỉ giáo.
input: ảnh từ camera đọc bằng opencv(liên tục), form có sẵn + picturebox
output: show ảnh cam lên picturebox(liên tục).

Đọc camera sẽ thu được một cv::Mat.
Trong đó có các thông tin :
rows : chiều cao ảnh (pixel)
cols : chiều rộng ảnh (pixel)
steps : số byte trên một line.
data : con trỏ dữ liệu.

Từ các thông tin trên sẽ tái tạo được một System::Drawing::Bitmap.
(Nhớ chọn constructor phù hợp).
Có được bitmap thì set image cho pixtureBox.

Quy trình nó là như vậy, debug dần xem nó lỗi ở chỗ nào.

5 Likes
System::Drawing::Bitmap^ img = gcnew System::Drawing::Bitmap(videoFrame.rows,videoFrame.cols, 4 * videoFrame.rows,
						System::Drawing::Imaging::PixelFormat::Format4bppIndexed, IntPtr(videoFrame.data));

picbScreen->Image = img;
picbScreen->Refresh();

Em gán nó hình ảnh lại cho picbScreen nhưng nó lại không load form giao diện.

Em nghĩ là em đang bị vấn đề là thằng picturebox không đồng bộ kịp vs frame vào camera rồi -> không hiện form.

1 Like

Em nên kiểm tra lại các thông số của ảnh.
Thông thường camera nó sẽ trả về ảnh BGR.

Em có thể dùng constructor này để tái tạo lại Bitmap:

Như vậy em phải viết thế này:

Bitmap^ img = gcnew Bitmap(videoFrame.cols,videoFrame.rows, videoFrame.step,PixelFormat::Format24bppRgb, IntPtr(videoFrame.data));

Ở cách trên phải chú ý chọn PixelFormat đúng.
Ở thông số stride thì phải chú ý:
step của cv::Mat thường luôn bằng cols * channels (số kênh màu).
Nhưng stride của Bitmap thì ở dạng cols * channels + x. Nên có nhiều trường hợp stride và step là không tương đồng nhau. Nếu đưa thẳng step vào hàm sẽ sinh ra méo ảnh.
Trong trường hợp đó cần tính lại stride hoặc cứ create bitmap với kích thước và định dạng phù hợp với cv::Mat rồi sau đó sửa stride của Bitmap phù hợp với step của cv::Mat và copy dữ liệu vào Bitmap thông qua lớp BitmapData.

4 Likes

Em chân thành cảm ơn mọi người đã giúp đỡ. Em đã tìm đc hướng giải quyết.
Show imgae: https://www.codeproject.com/Tips/741107/How-to-Display-Image-In-Picturebox-in-VCplusplus-f
Load video cam lên picturebox: https://www.codeproject.com/Articles/741055/Video-Capture-using-OpenCV-with-VCplusplus
Giờ là em phải ngồi hiệu chỉnh lại cho thành code của em.

3 Likes

Em đã tái chế code. Nhưng khi nó chạy thì nó xuất hiện lỗi access voliate. Code em để trong form_load khi gán picturebox = image thì nó xuất hiện lỗi trên. Anh có thể cho em hướng giải quyết đc không? Em bí rồi.

Em phải đưa code của em lên.

Cách của a là khai báo một Bitmap là biến toàn cục (global), tức là ngoài hàm.

Mỗi khi đọc được ảnh, sẽ kiểm tra kích thước so với Bitmap này, nếu có thay đổi kích thước thì khai báo lại Bitmap.

Sau đó chỉ copy dữ liệu từ cv::Mat (C++) hoặc MiplImage © vào bộ đệm của Bitmap. Sau đó gián lại Bitmap vào Image của pictureBox.

Cách làm này khắc phục được việc RAM không tăng ngút trời.

Mà a khuyên that là làm OpenCV thì chuyển hẳn sang C++ native. Có thể dùng QT.
Dùng thằng C++.NET vừa native lại vừa .NET tồn tại song song mệt lắm.

4 Likes

Dạ em cảm ơn anh. Em cũng đang tính chuyển sang qt luôn. Em vật vả vs C++ .Net quá. Máy em sài khá cùi mà build 1 project cực quá.

Nếu có ý định thì chuyển luôn em ạ. Chia tay sớm bớt đau khổ :smile:
Ngày xưa a cũng vật vã với thằng C++.NET rồi mới sang QT.

5 Likes

dạ em chuyển qua luôn rồi anh. 4 ngày làm không ra nó qua QT chỉ cần 30 phút lấy code nó về tinh chỉnh là xong. Mà 4 < 30 mà sau .Net khó xơi quá. :rofl::rofl::joy:

2 Likes

.NET nó chỉ yêu nhau với C# thôi.
.NET với C++ nó không thích nhau mà vẫn phải cưới nên đẻ ra C++.NET nó khó tính vậy đó :smile:

4 Likes

MS toàn ép hôn không hèn chi thất bại(Không xứng đôi vừa lứa) :rofl:

1 Like

C++ là con vợ trước của MS.
C# mới là con cưng.

Mà nói vui thế thôi.
Tại mình gà không làm chủ được thôi.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?