python opencv 4.1.0 cv2.convertScaleAbs()函数 (通过线性变换将数据转换成8位[uint8])(用于Intel Realsense D435显示depth图像)
文章目錄
- API文檔
- 代碼示例:Intel Realsense圖像的兩種對齊方式
- 驗證猜想
- 完整示例代碼
API文檔
def convertScaleAbs(src, dst=None, alpha=None, beta=None): # real signature unknown; restored from __doc__"""convertScaleAbs(src[, dst[, alpha[, beta]]]) -> dst. @brief Scales, calculates absolute values, and converts the result to 8-bit.縮放,計算絕對值,然后將結果轉換為8位。. . On each element of the input array, the function convertScaleAbs. performs three operations sequentially: scaling, taking an absolute. value, conversion to an unsigned 8-bit type:在輸入數組的每個元素上,函數convertScaleAbs依次執行三個操作:縮放,獲取絕對值,轉換為無符號的8位類型:. \f[\texttt{dst} (I)= \texttt{saturate\_cast<uchar>} (| \texttt{src} (I)* \texttt{alpha} + \texttt{beta} |)\f]. In case of multi-channel arrays, the function processes each channel. independently. When the output is not 8-bit, the operation can be. emulated by calling the Mat::convertTo method (or by using matrix. expressions) and then by calculating an absolute value of the result.如果是多通道陣列,該函數將獨立處理每個通道。 當輸出不是8位時,可以通過調用Mat :: convertTo方法(或使用矩陣表達式),然后通過計算結果的絕對值來模擬該操作。. For example:. @code{.cpp}. Mat_<float> A(30,30);. randu(A, Scalar(-100), Scalar(100));. Mat_<float> B = A*5 + 3;. B = abs(B);. // Mat_<float> B = abs(A*5+3) will also do the job,. // but it will allocate a temporary matrix. @endcode. @param src input array. 輸入數組。. @param dst output array. 輸出數組。. @param alpha optional scale factor. 可選比例因子。. @param beta optional delta added to the scaled values. 可選增量添加到縮放值。. @sa Mat::convertTo, cv::abs(const Mat&)"""pass代碼示例:Intel Realsense圖像的兩種對齊方式
cv.convertScaleAbs(depth_image, alpha=0.03)假設我們需要讓我們的深度攝像頭感興趣的距離范圍有差別地顯示,那么我們就需要確定一個合適的alpha值,公式為:有效距離*alpha=255,假設我們想讓深度攝像頭8m距離內的深度被顯示,>8m的與8m的顏色顯示相同,那么alpha=255/(8*10^3)≈0.03,假設我們想讓深度攝像頭6m距離內的深度被顯示,>6m的與6m的顏色顯示相同,那么alpha=255/(6*10^3)≈0.0425,cv.convertScaleAbs()函數對輸入數組進行如下運算:
對于輸入深度圖數組中的每個值srci(它是16位的,數據類型是uint16),先乘以系數α,再加上偏置β,最后將結果取絕對值,并截取為8位(uint8),然后返回與原數組相同維度的數組dsti。
驗證猜想
猜測如果計算后的值大于255,則將其取為255(8位最大值)。
import numpy as np import cv2 as cv depth_image=np.array([[1000,2,3],[8000,-8000,6],[-1000,8,9]]) print('depth_image:\n',depth_image) depth_image_map=cv.convertScaleAbs(depth_image,alpha=0.03,beta=100) print('depth_image_map:\n',depth_image_map)結果:
depth_image:[[ 1000 2 3][ 8000 -8000 6][-1000 8 9]] depth_image_map:[[130 100 100][255 140 100][ 70 100 100]]驗證結果正確!
完整示例代碼
import pyrealsense2 as rs import cv2 as cv import numpy as nppipeline = rs.pipeline()cfg = rs.config() cfg.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) cfg.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)# 設定需要對齊的方式(這里是深度對齊彩色,彩色圖不變,深度圖變換) align_to = rs.stream.color # 設定需要對齊的方式(這里是彩色對齊深度,深度圖不變,彩色圖變換) # align_to = rs.stream.depthalignedFs = rs.align(align_to)profile = pipeline.start(cfg)try:while True:fs = pipeline.wait_for_frames()aligned_frames = alignedFs.process(fs)color_frame = aligned_frames.get_color_frame()depth_frame = aligned_frames.get_depth_frame()if not depth_frame or not color_frame:continuecolor_image = np.asanyarray(color_frame.get_data())depth_image = np.asanyarray(depth_frame.get_data())# D·C 191122:打印depth_image的最大值看看# print(depth_image.max())# 可以看到,最大的數值從一萬到六萬不等(表示最遠距離十多米到六十米這樣)# D·C 191122:打印數據類型看看# print(depth_image.dtype)# uint16# print(color_image.dtype)# uint8# D·C 191122:打印color_image的維度看看# print(color_image.shape)# (480, 640, 3)# print(depth_image.shape)# (480, 640)# D·C 191122:打印cv.convertScaleAbs(depth_image, alpha=0.03)的數據類型和維度看看:# print(cv.convertScaleAbs(depth_image, alpha=0.03).dtype)# uint8# print(cv.convertScaleAbs(depth_image, alpha=0.03).shape)# (480, 640)# D·C 191122:打印cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET)的數據類型和維度看看# print(cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET).dtype)# uint8# print(cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET).shape)# (480, 640, 3)# D·C 191122:打印cv.convertScaleAbs(depth_image, alpha=0.03)的最大值看看# print(cv.convertScaleAbs(depth_image, alpha=0.03))# 可看到最大值為255# 估計若原值*alpha大于255,則將其取值為255,而當alpha為0.03時,能夠映射的最大可變距離為255/0.03=8500mm=8.5m# D·C 191122:修改alpha參數后,發現圖像對比度發生變化(比如alpha=1,圖像基本呈紅沒啥對比度、alpha=0.001,圖像呈藍也沒啥對比度、alpha=1點幾,效果也不行)# origin:depth_image = cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET)depth_image = cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET)images = np.hstack((color_image, depth_image))# window = cv.namedWindow('window', cv.WINDOW_AUTOSIZE)cv.imshow('window', images)cv.waitKey(1) finally:pipeline.stop()參考文章1:【OpenCV3】cv::convertScaleAbs()使用詳解
參考文章2:opencv中圖像基礎(大小,深度,通道)
參考文章3:圖像位深度 8位 16位 24位 32位區別對比 RGB 真彩色 基本概念:(大小,深度,通道)位深度數據類型轉換原理 Mat數據讀取(opencv里的imread)
總結
以上是生活随笔為你收集整理的python opencv 4.1.0 cv2.convertScaleAbs()函数 (通过线性变换将数据转换成8位[uint8])(用于Intel Realsense D435显示depth图像)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python opencv imread
- 下一篇: Intel RealsenseD435