2011-08-02 42 views
8

Tôi đang làm việc với Kinect và OpenCV. Tôi đã tìm kiếm trong diễn đàn này nhưng tôi không tìm thấy bất cứ điều gì giống như vấn đề của tôi. tôi giữ cho dữ liệu sâu liệu từ Kinect (16 bit), tôi lưu nó trong một CvMat * và sau đó tôi vượt qua nó để cvGetImage để tạo ra một IplImage * từ nó:Chuyển đổi độ sâu 16 bit CvMat * sang độ sâu 8 bit

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
[...] 
cvGetImage(depthMetersMat,temp); 

Nhưng bây giờ tôi cần phải làm việc trên hình ảnh này để làm cvThreshdold và tìm đường nét. Hai chức năng này cần một hình ảnh có độ sâu 8 bit ở đầu vào. Làm thế nào tôi có thể chuyển đổi CvMat * depthMetersMat trong 8-bit-depth-CvMat *?

Trả lời

2

này nên làm việc:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

Nhưng according to the OpenCV docs, CvMat là lỗi thời. Thay vào đó, bạn nên sử dụng Mat.

19

Câu trả lời mà @SSteve đã thực hiện gần như đã làm cho tôi, nhưng cuộc gọi đến convertTo dường như chỉ cắt bỏ thứ tự byte cao thay vì thực sự mở rộng các giá trị thành dải 8 bit. Vì @Sirnino không chỉ định hành vi nào được mong muốn, tôi nghĩ tôi sẽ đăng mã sẽ làm việc mở rộng (tuyến tính), trong trường hợp bất kỳ ai khác muốn làm điều đó.

mã ban đầu SSteve của:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

Để mở rộng các giá trị, bạn chỉ cần thêm các yếu tố quy mô (1/256, hoặc 0,00390625, 16-bit đến 8-bit rộng) là tham số thứ ba (alpha) cho cuộc gọi đến convertTo

m2.convertTo(m2, CV_8U, 0.00390625); 

Bạn cũng có thể thêm một tham số thứ tư (đồng bằng) sẽ được thêm vào mỗi giá trị sau khi được nhân với alpha. Xem docs để biết thêm thông tin.

+2

Điều gì có nghĩa là "Quy mô giá trị"? – Maystro

+2

@Maystro, số 16 bit chưa ký có thể có giá trị bất kỳ ở đâu từ 0 đến 65,535, nhưng chúng tôi cần giá trị để vừa với số 8 bit, chỉ có thể giữ giá trị từ 0 đến 255. Vì vậy, chúng tôi áp dụng hệ số tỷ lệ , điều đó có nghĩa là bạn nhân mỗi giá trị với hằng số, trong trường hợp này là 0,00390625. Bất kỳ số nào trong ma trận gốc có giá trị 0 đến 255 nhận giá trị mới là 0, 256 đến 511 trở thành 1, 512 đến 767 trở thành 2, v.v. – Gillfish

+1

Vì vậy, nó giống như m2.convertTo (m2/256, CV_8U) đúng? Một câu hỏi khác, nếu chúng ta không vượt qua một tham số yếu tố tỷ lệ thì sao? nó sẽ được tính như thế nào? – Maystro

Các vấn đề liên quan