日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【opencv】YUV各种色彩、YUV420sp2RGB

發布時間:2025/3/21 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【opencv】YUV各种色彩、YUV420sp2RGB 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于 YUV 所表示的圖像,Y 和 UV 分量是分離的。如果只有 Y 分量而沒有 UV 分離,那么圖像表示的就是黑白圖像。彩色電視機采用的就是 YUV 圖像,解決與和黑白電視機的兼容問題,使黑白電視機也能接受彩色電視信號。

人眼對色度的敏感程度低于對亮度的敏感程度。主要原因是視網膜桿細胞多于視網膜錐細胞,其中視網膜桿細胞的作用就是識別亮度,視網膜錐細胞的作用就是識別色度。所以,眼睛對于亮度的分辨要比對顏色的分辨精細一些。

利用這個原理,可以把色度信息減少一點,人眼也無法查覺這一點。

所以,并不是每個像素點都需要包含了 Y、U、V 三個分量,根據不同的采樣格式,可以每個 Y 分量都對應自己的 UV 分量,也可以幾個 Y 分量共用 UV 分量。相比 RGB,能夠節約不少存儲空間。

YUV 4:4:4采樣方式與 RGB 圖像大小是一樣的。
YUV 4:2:2相比 RGB, 節省了三分之一的存儲空間。
YUV 4:2:0相比 RGB, 節省了一半的存儲空間。

設實際寬高為w*h的圖像,如果是RGB格式,那么他的數據量為w*h*3;
如果是yuv420格式,那么他的數據量為w*h*1.5
因為yuv4:4:4的數據量等于RGB數據量,而yuv4:4:4是yuv4:2:0數據量的2倍,所以yuv4:2:0的數據量為w*h*3/2。

從yuv420sp轉化得到RGB的步驟:
  • 1.當我們拿到一幀圖像的yuv原始數據后,首先需要明確拿到的是以下哪種yuv數據:yuv4:4:4、yuv4:2:2、yuv4:2:0。并且,我們都會知道給對應圖像的寬和高,因為這都是驅動配置給出的。如果你是從yuv元素數據中截取出來的某roi區域的yuv數據,那么你也應該知道該roi的寬和高。注意,此時的寬和高是指圖像的寬和高,不是指代圖像數據碼流排列的行數和列數。
  • 2.把原始yuv數據通過構造cv::Mat格式封裝起來,此時的cv::Mat的寬(.cols)和高(.rows)就需要變化了,因為yuv格式和RGB格式的數據量是不一樣的,yuv格式如果不是yuv4:4:4(yuv數據量為w*(h*3))的話,那么yuv格式的數據量是一定比RGB少的。所以,此時如果是yuv420格式,就根據yuv420格式的特點,把cv::Mat的寬高設置為w*(h*1.5),且必須為單通道,注意這里寬度不變,是在高度上延伸。yuyv原始數據變成cv::Mat格式后,你如果直接imshow顯示的話,圖像會變高。轉化成RGB格式后才會恢復為正常寬和高。
  • 3.然后再通過cv::cvtColor(yuyv_img, rgb_img, cv::COLOR_YUV420sp2RGB);轉化得到RGB圖像。

注意構造yuyv的cv::Mat時通道類型是CV_8UC1,而構造RGB的cv::Mat時通道類型是CV_8UC3.

cv::Mat yuyv_img =cv::Mat(box.height * 3 / 2, box.width, CV_8UC1,const_cast<unsigned char *>(yuv_raw.data())); if (!yuyv_img.data) {std::cout << "empty yuyv_img"<< std::endl; } cv::Mat rgb_img = cv::Mat(box.height, box.width, CV_8UC3); cv::cvtColor(yuyv_img, rgb_img, cv::COLOR_YUV420sp2RGB);

可參考下面兩篇文章來理解YUV:
一文理解 YUV
YUV色彩格式總結

總結

以上是生活随笔為你收集整理的【opencv】YUV各种色彩、YUV420sp2RGB的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。