1. 程式人生 > >V4L2文件翻譯(六)

V4L2文件翻譯(六)

影象裁剪、插入及縮放

一些視訊捕捉裝置可以取一張圖片的小部分,然後對圖片進行任意尺寸的放大或縮小。我們將這些能力稱之為裁剪和縮放。一些視訊使出裝置可以將圖片放大或縮小,然後將其插入到視訊訊號的任意掃描線和橫向偏移中。

應用程式可以使用一下API來選擇視訊訊號中的區域,查詢預設區域以及硬體限制。不管他們的名字是什麼,VIDIOC_CROPCAP VIDIOC_G_CROP VIDIOC_S_CROP ioctl都可以作用於輸入及輸出裝置。

裁剪需要源和目標。在視訊捕捉或overlay裝置上源就是視訊訊號,然後通過裁剪ioctl決定需要裁剪的區域。目標就是程式讀取的圖片或overlay到物理螢幕上。他們的尺寸(overlay可選)是通過VIDIOC_G_FMT和VIDIOC_S_FMT ioctl協商決定的。

在一個視訊輸出裝置上源是應用程式走過的圖片,他們的尺寸還是通過VIDIOC_G/S_FMT ioctl協商確定的,或者也可能是編碼壓縮入了視訊流中。目標是視訊訊號,且才加你ioctl決定圖片插入哪個區域。

就算裝置不支援裁剪或VIDIOC_G/S_FMT等ioctl源和目標矩形區域依然被定義。他們的尺寸(或許是位置)在這種情況下將不變。所有捕捉及輸出裝置必須支援VIDIOC_CROPCAP ioctl,這樣應用程式就可以決定能否進行裁剪。

裁剪結構體

視訊捕捉裝置左上角,可取樣區域的寬高可以通過VIDIOC_CRAOCAP ioctl返回的struct v4l2_cropcap結構體中的bound子成員結構體給出。為了相容更廣泛的硬體裝置,這裡不會定義起點和單位。按照慣例,驅動應該橫向計算相對於0H的取樣範圍,豎向的是第一個區域(4.2 ITU-R 525)的ITU-R線數量。如果驅動能夠捕獲兩個區域則乘以二。

左上角源矩形的寬高是實際能取樣的區域,通過struct v4l2_crop結構體給出,座標系統與struct v4l2_cropcap相同。應用程式可以通過使用VIDIOC_G_CROP和VIDIOC_S_CROP ioctl來獲取和設定矩形區域。它必須完全在捕捉範圍內,而且驅動之後可能根據硬體限制修改所請求的尺寸及(或)位置。

每個捕捉裝置都有一個預設的源矩形,通過struct v4l2_cropcap結構提中的defrect成員結構體給出。矩形的中心應該與視訊訊號中的活躍圖片區域中心對準,且涵蓋驅動編寫者所關心的完整圖片。在驅動首次載入時,驅動就應對源矩形區域進行重置,而不是之後再做。

對於輸出裝置來說,這些結構體和ioctl的使用就要看情況。定義目標矩形區域即代表要把圖片插入到視訊訊號中的哪裡。

縮放調整

視訊硬體可擁有各種裁剪、插入及縮放限制。可能只能放大或縮小,只支援離散的縮放係數,或在橫向和豎向上有不同的縮放能力,也可能根本就不支援縮放。struct v4l2_crop矩形被對齊的同時,源和目標矩形可能擁有了無限制的縮放尺寸。特別是在結構體struct v4l2_crop中的最大width和height可能會比struct v4l2_cropcap.bounds區域要小。因此,慣例,驅動要對請求的引數進行調整然後返回選擇的實際值。

應用程式可以首先改變源或目標的矩形區域,比如一張特殊的圖片尺寸或視訊訊號中的明確區域。如果驅動不得不因為硬體限制進行調整,那麼最後的請求是最優先的,且驅動應該傾向於調整相反的那一個。無論如何,VIDIOC_TRY_FMT ioctl不應該修改驅動狀態,且只是調整所請求的矩形區域。

假設在一個視訊捕捉裝置上進行縮放,在每個方向上其係數為1:1或2:1,且影象尺寸必須是16 x 16畫素的整數倍。源裁剪矩形區域被設定為預設,這個區域也作為此例中的上限值。640 x 400畫素為偏移0,0。一個應用程式請求一張300 x 225畫素的圖片,假設視訊會根據全圖進行縮小。驅動設定影象尺寸為最接近的數值304 x 224,然後選擇裁剪矩形區域為最接近請求尺寸的608 x 224(224 x 2:1會超過400的限制)。偏移0,0依然有效,因為未修改過。通過VIDIOC_CROPCAP給出的預設裁剪矩形區域,應用程式可以輕鬆的修改此區域中心。

現在,應用程式可以使用畫素縱橫比接近原始請求的圖片來覆蓋區域,所以它請求裁剪608 x 456畫素的矩形區域。當前縮放係數限制裁剪只能到640 x 384,所以驅動返回608 x 384的裁剪尺寸,並且調整圖片尺寸為最接近的304 x 192。

示例

源和目標矩形區域在關閉和重開啟一個裝置時應保持不變,以至於穿梭與裝置的管道資料不需要特別的準備。高階的應用程式會在開始IO操作前確認引數是否合適。

例1.10 重置裁剪引數
假設一個視訊捕捉裝置,為其他裝置修改V4L2_BUF_TYPE_VIDEO_CAPTURE。

struct v4l2_cropcap cropcap;
struct v4l2_crop crop;

memset (&cropcap, 0, sizeof (cropcap));
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

if (-1 == ioctl (fd, VIDIOC_CROPCAP, &cropcap)) {
    perror ("VIDIOC_CROPCAP");
    exit (EXIT_FAILURE);
}

memset (&crop, 0, sizeof (crop));
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect;

/* Ignore if cropping is not supported (EINVAL). */

if (-1 == ioctl (fd, VIDIOC_S_CROP, &crop)
    && errno != EINVAL) {
    perror ("VIDIOC_S_CROP");
    exit (EXIT_FAILURE);
}

例1.11 簡單縮放

struct v4l2_cropcap cropcap;
struct v4l2_format format;

reset_cropping_parameters ();

/* Scale down to 1/4 size of full picture. */

memset (&format, 0, sizeof (format)); /* defaults */

format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

format.fmt.pix.width = cropcap.defrect.width >> 1;
format.fmt.pix.height = cropcap.defrect.height >> 1;
format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;

if (-1 == ioctl (fd, VIDIOC_S_FMT, &format)) {
    perror ("VIDIOC_S_FORMAT");
    exit (EXIT_FAILURE);
}

例1.12 選擇輸出區域

struct v4l2_cropcap cropcap;
struct v4l2_crop crop;

memset (&cropcap, 0, sizeof (cropcap));
cropcap.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;

if (-1 == ioctl (fd, VIDIOC_CROPCAP;, &cropcap)) {
    perror ("VIDIOC_CROPCAP");
    exit (EXIT_FAILURE);
}

memset (&crop, 0, sizeof (crop));

crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
crop.c = cropcap.defrect;

/* Scale the width and height to 50 % of their original size
   and center the output. */

crop.c.width /= 2;
crop.c.height /= 2;
crop.c.left += crop.c.width / 2;
crop.c.top += crop.c.height / 2;

/* Ignore if cropping is not supported (EINVAL). */

if (-1 == ioctl (fd, VIDIOC_S_CROP, &crop)
    && errno != EINVAL) {
    perror ("VIDIOC_S_CROP");
    exit (EXIT_FAILURE);
}

例1.13 當前縮放係數與畫素縱橫比

struct v4l2_cropcap cropcap;
struct v4l2_crop crop;
struct v4l2_format format;
double hscale, vscale;
double aspect;
int dwidth, dheight;

memset (&cropcap, 0, sizeof (cropcap));
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

if (-1 == ioctl (fd, VIDIOC_CROPCAP, &cropcap)) {
    perror ("VIDIOC_CROPCAP");
    exit (EXIT_FAILURE);
}

memset (&crop, 0, sizeof (crop));
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

if (-1 == ioctl (fd, VIDIOC_G_CROP, &crop)) {
    if (errno != EINVAL) {
        perror ("VIDIOC_G_CROP");
        exit (EXIT_FAILURE);
    }

    /* Cropping not supported. */
    crop.c = cropcap.defrect;
}

memset (&format, 0, sizeof (format));
format.fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

if (-1 == ioctl (fd, VIDIOC_G_FMT, &format)) {
    perror ("VIDIOC_G_FMT");
    exit (EXIT_FAILURE);
}

/* The scaling applied by the driver. */

hscale = format.fmt.pix.width / (double) crop.c.width;
vscale = format.fmt.pix.height / (double) crop.c.height;

aspect = cropcap.pixelaspect.numerator /
     (double) cropcap.pixelaspect.denominator;
aspect = aspect * hscale / vscale;

/* Devices following ITU-R BT.601 do not capture
   square pixels. For playback on a computer monitor
   we should scale the images to this size. */

dwidth = format.fmt.pix.width / aspect;
dheight = format.fmt.pix.height;

相關推薦

V4L2翻譯

影象裁剪、插入及縮放 一些視訊捕捉裝置可以取一張圖片的小部分,然後對圖片進行任意尺寸的放大或縮小。我們將這些能力稱之為裁剪和縮放。一些視訊使出裝置可以將圖片放大或縮小,然後將其插入到視訊訊號的任意掃描線和橫向偏移中。 應用程式可以使用一下API來選擇視訊訊號中的區域

V4L2翻譯十三

I/O流 (DMA快取引用) 這是一個實驗性介面,將來可能發生改變 DMABUF框架提供了在多裝置見共享快取的通用方法,支援DMABUF的裝置驅動可以將一個DMA快取以檔案控制代碼的方式輸出到使用者空間(輸出者規則),以檔案控制代碼的方式從使用者空間獲取一個DMA快取

V4L2翻譯

裁剪、組合及縮放的實驗性API 實驗性介面將來也許會發生改變 介紹 一些視訊捕捉裝置可以對一張圖片的取樣部分進行任意尺寸的縮小或放大。然後,這些裝置可以講這個圖片插入到更大的圖片中。一些視訊輸出裝置可以對輸入圖片進行部分裁剪,對其進行縮放以及將其插入到視訊訊號的任意

V4L2翻譯

視訊標準 視訊裝置通常支援一種或多種不同的視訊標準或更多的標準衍生體。每一個視訊輸入和輸出支援一組標準。這項設定由VIDIOC_ENUMINPUT和VIDIOC_ENUMOUTPUT ioctl返回的v4l2_input和v4l2_output結構體中的std成員體現。

V4L2翻譯

擴充套件控制 介紹 控制機制原本是用於使用者設定(如亮度,飽和度等)。但無論如何,它恰恰證明了對於複雜驅動他是個非常有用的模型,如每個驅動包含一個大型API的子模組。 MPEG編碼API就是在這樣的設計理念下:MPEG標準十分龐大,當前支援MPEG編碼的硬體只是聲明瞭這個

V4L2翻譯

好久沒更新,有好幾篇翻譯都沉寂在Wiznote中了。趕緊發出來~ YUV格式 YUV是源自於TV廣播的符合視訊訊號,它將亮度資訊(Y)從顏色資訊(U、V或Cb、Cr)。顏色資訊涵蓋了紅色和藍色的顏色差異訊號,這樣藍色部分就可以通過減去亮度資訊進行重建。見“顏色空間”

V4L2翻譯十一

壓縮格式 定義 碼 描述 V4L2_PIX_FMT_JPEG 'JPEG' 待定,見VIDIOC_G_JPEGCOMP VIDIOC_S_JPEGCOMP V4L2_PIX_FMT_MPEG 'MPEG' MPEG複合流,實際格式由V4L2_CID_MPEG_

python學習筆記操作

python1、文件操作流程:打開文件,得到文件句柄並賦值給一個變量通過句柄對文件進行操作關閉文件如下文件:2017-03-24 11:25:06:349 - info: [debug] [AndroidBootstrap] Sending command to android: {"cmd":"shutdo

Pilosa翻譯入門指南

目錄 開始 Pilosa 簡單專案 建立架構(Create the Schema) 從CVS檔案匯入資料 做一些查詢(Queries) 接下來做什麼? Pilosa支援預設使用JSON的HTTP介面。 任何HTTP工具都可用於與Pilosa伺服器進行互動。 本文件中的示例將使

Pilosa翻譯示例

目錄 傳輸Transportation 簡單說明 Introduction 資料模型 Data Model 對映Mapping 原文地址 傳輸Transportation 簡單說明 Introduction 紐約市釋出了一個非

Hyperledger Fabric 1.3 官方翻譯關鍵概念 (Key Concepts)

身份(Identity) 什麼是身份(What is an Identity)? The different actors in a blockchain network include peers, orderers, client applications,

Vue-Analgtics 使用者翻譯部分

本部落格旨在個人筆記記錄。 一.1.開始 安裝      npm install vue-analytics --save    2.開始使用你的Vue應用程式,在main.js中加入以下程式碼      import Vue from 'vue'      import

Hyperledger Fabric 1.3 官方翻譯教程 (Tutorials)

構建你的第一個網路(Building Your First Network) These instructions have been verified to work against the latest stable Docker images and t

PureMVC 官方翻譯

    最近在學習PureMVC框架,感覺最權威的還是閱讀官方文件,順便翻譯了下全當記筆記了。 PureMVC概覽     這篇文件他討論PureMVC框架的類和介面,使用UML來闡述它們的角色、職責和協作。     PureMVC框架有一個非常細小的目標一一就是幫助你把應用程式編碼之間的關聯分離成明確

ECMAScript 2015官方翻譯

宣告:   1.翻譯文章旨在輔助理解,沒有講究語言方面的信達雅,英文原版傳送門:http://www.ecma-international.org/ecma-262/6.0/   2.有的地方翻譯的很拗口,因為官方文件用詞句法都很嚴謹,本人也是

Spark官方調優翻譯轉載

Spark調優 由於大部分Spark計算都是在記憶體中完成的,所以Spark程式的瓶頸可能由叢集中任意一種資源導致,如:CPU、網路頻寬、或者記憶體等。最常見的情況是,資料能裝進記憶體,而瓶頸是網路頻寬;當然,有時候我們也需要做一些優化調整來減少記憶體佔用,例如將RDD以序列化格式儲存(storing RD

Theano Tutorial翻譯:詞彙

Apply 應用 應用的意思是對於輸入進行運算然後產生輸出值。就像是數學函式a[符號值] Broadcasting 廣播 廣播是一個允許把不同維度的張量通過一個一個元素進行運算的機制。他通過複製相對小的張量來進行運算。 Constant 常數

Autofac官方翻譯——Getting Started

立即開始 將Autofac整合到你的應用的基本模式如下: 按照控制反轉(IoC)的思想構建你的應用程式 新增Autofac引用 在application啟動程式碼裡… 建立ContainerBuilder物件 註冊元件 Build容器並且儲存以備用 在程式

Kafka官方翻譯產品概述

流平臺的三要素: 1、提供釋出/訂閱記錄流的能力,類似於訊息佇列; 2、對記錄流的儲存有容錯能力; 3、可以即時處理記錄流。kafka可用於兩大類應用: 1、建立實時流資料管道,在系統或應用之間進行可靠傳輸; 2、建立基於實時流的應用,可以傳輸或處理資料流。先知概念: *k

android開源圖表庫MPAndroidChart翻譯

public interface OnChartGestureListener { /** * Callbacks when a touch-gesture has started on the chart (ACTION_DOWN) * * @param me