OpenCV里IplImage的widthStep參數 和width參數

????? 一直以為IplImage結構體中的widthStep元素大小等于width*nChannels,大錯特錯!(為了快速訪問,要內存對齊啊)查看OpenCV2.1的源碼,在src/cxcore/cxarray.cpp文件中,找到cvInitImageHeader函數,函數中對widthStep大小賦值如下:

  image->widthStep = (((image->width * image->nChannels *(image->depth & ~IPL_DEPTH_SIGN) + 7)/8)+ align - 1) & (~(align - 1));???????????????????????????????????????????

???? 其中IPL_DEPTH_SIGN的定義可以在cxtypes.h中找到,定義為:#define IPL_DEPTH_SIGN 0x80000000, align的大小為CV_DEFAULT_IMAGE_ROW_ALIGN,其大小在cxmisc.h中定義為:#define??CV_DEFAULT_IMAGE_ROW_ALIGN?4,depth取8位深度。

???? 根據(1)式,已知IPL_DEPTH_SIGN、align、depth 的大小,分別手動計算如下圖像的widthStep:

????????圖像寬度?????圖像通道數??????????????計算得到的widthStep

????????3????????????????????3?????????????????????????????12

????????3????????????????????1?????????????????????????????4

????????5????????????????????3????????????????????????????16

????????5????????????????????1?????????????????????????????8

????????7????????????????????3?????????????????????????????24

????????7????????????????????1?????????????????????????????8

????????4????????????????????3?????????????????????????????12

????????4????????????????????1?????????????????????????????4

??????? 為了進一步驗證手算的正確性,我們編程實現輸出widthStep的大小,程序如下:


IplImage *image_33 = cvCreateImage(cvSize(3, 3), 8, 3);IplImage *image_31 = cvCreateImage(cvSize(3, 3), 8, 1);IplImage *image_53 = cvCreateImage(cvSize(5, 3), 8, 3);IplImage *image_51= cvCreateImage(cvSize(5, 3), 8, 1);IplImage *image_73 = cvCreateImage(cvSize(7, 3), 8, 3);IplImage *image_71 = cvCreateImage(cvSize(7, 3), 8, 1);printf("%d, %d, %d, %d, %d, %d", image_33->widthStep,image_31->widthStep,image_53->widthStep,image_51->widthStep,image_73->widthStep,image_71->widthStep);

?????????? 運行結果為:12, 4, 16, 8, 24, 8, 與手動計算結果相同。

????????? 從網上查閱資料,OpenCV分配的內存按4字節對齊,這樣我們對上述計算的結果可以有個合理的解釋,如寬度為3、通道數為3的圖像,每一行需要的 實際內存長度為3*3,為了內存對齊,OpenCV會在每行末尾自動補上3個字節的內存,內存初始化都為0,所以widthStep變為了12。

widthStep大小對IplImage極為重要,在cxarray.cpp中,我們可以找到如下代碼行:

image->imageSize = image->widthStep * image->height;img->imageData = img->imageDataOrigin =(char*)cvAlloc( (size_t)img->imageSize );

????? 可見widthStep直接影響到imageData的數據長度。在操作imageData時,我們要避開對OpenCV自動補齊的內存進行操作,如直方圖計算等。

寫到這里,可能有人會問,我們平常都用widthStep = width * nChannels,怎么就沒出錯?我之前也一直在疑惑,合理的解釋是,一般在實際應用中,圖像的寬度一般為128, 256, 240, 320, 356,704等,剛好這些數字都能被4整除,widthStep剛好等于width * nChannels, 所以OpenCV并沒有為這些圖像分配多的內存,因此我們在對imageData做順序操作也沒出錯。但是,請問誰能保證圖像的寬度一定會是4的倍數??


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數字信號處理】——Python頻譜繪制

# -*- coding: utf-8 -*- from matplotlib import pyplotpyplot.rcParams[font.sans-serif] [SimHei] pyplot.rcParams[axes.unicode_minus] Falseimport numpy as np import matplotlib.pyplot as pl import matplotlib import math import randomN 500 # 繪制點總數 fs 5…

Android開發:《Gradle Recipes for Android》閱讀筆記1.3

想命令行執行gradle的構建,可以通過提供的gradle wrapper或者安裝gradle。 構建android項目不需要安裝gradle,因為android studio已經包含gradle。"gradle wrapper"指的是根目錄下的gradlew和gradlew.bat腳本(結尾的w是wrapper的意…

pic

轉載于:https://www.cnblogs.com/edisonxiang/p/5392651.html

leetcode 643 Maximum Average Subarray I

題目詳情 Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value. 輸入一個數組nums和一個整數k。要求找出輸入數組中長度為k的子數組&#xff0c…

OpenCV之cvSmooth函數平滑濾波

1、cvSmooth函數用法 定義原型 <span style"font-size:12px;"> void cvSmooth( const CvArr* src, CvArr* dst,int smoothtypeCV_GAUSSIAN,int param1, int param2, double param3, double param4 );</span>src:輸入圖像. dst:輸出圖像. smoot…

【python數字信號處理】——DFT、DTFT(頻譜圖、幅度圖、相位圖)

目錄 一、離散時間傅里葉變換DTFT 二、離散傅里葉變換DFT 三、DFT與DTFT的關系 ? 參考&#xff1a; 《數字信號處理》——&#xff08;一&#xff09;.DTFT、DFT(python實現)_遠行者223的博客-CSDN博客python繪制頻譜圖DTFT&#xff0c;DFTpython繪制頻譜圖&#xff1a;…

ERROR:Tried to register widget id ==basemapGalleryDiv but that id is already registered解決辦法

在ArcGIS Server開發中&#xff0c;遇到DIV已經被注冊的情況&#xff0c;不能對原DIV內容進行更新。這里需要調用Dojo的destroyRecursive&#xff08;&#xff09;方法&#xff0c;逐個銷毀該Widget下的子元素及其后代元素。然后就可以在原DIV上注冊新的小部件。 示例代碼&…

通過Spring Data Neo4J操作您的圖形數據庫

在前面的一篇文章《圖形數據庫Neo4J簡介》中&#xff0c;我們已經對其內部所使用的各種機制進行了簡單地介紹。而在我們嘗試對Neo4J進行大版本升級時&#xff0c;我發現網絡上并沒有任何成型的樣例代碼以及簡介&#xff0c;而其自身的文檔也對如何使用Spring Data Neo4J介紹得語…

圖像金字塔

圖像金字塔被廣泛用于各種視覺應用中。圖像金字塔是一個圖像集合&#xff0c;集合中所有的圖像都源于同一個原始圖像&#xff0c;而且是通過對原始圖像連續降采樣活得&#xff0c;直到達到某個中止條件才停止降采樣。&#xff08;當然&#xff0c;降為一個像素肯定是中止條件。…

python使用git進行版本控制-分支管理

1、遠程克隆 最好的方式是先創建遠程庫&#xff0c;然后&#xff0c;從遠程庫克隆&#xff1a; 首先在github上創建一個新的倉庫&#xff0c;名字叫gitskills 我們勾選Initialize this repository with a README&#xff0c;這樣GitHub會自動為我們創建一個README.md文件。 下一…

【python數字信號處理】——Z變換

目錄 一、公式 二、代碼 三、結果 一、公式 頻域變量&#xff1a;z 時域變量&#xff1a;n 常見序列的Z變換&#xff1a;信號與系統復習歸納&#xff08;十一&#xff09;&#xff1a;Z變換例題_百把人的博客-CSDN博客_z變換例題基于東南大學陳從顏譯《信號、系統和變換》和…

九宮格拼圖 支持44 55等

代碼下載轉載于:https://www.cnblogs.com/ygcool/p/5395343.html

144. Binary Tree Preorder Traversal

Given a binary tree, return the preorder traversal of its nodes values. For example:Given binary tree {1,#,2,3}, 1\2/3return [1,2,3]. 該題是對樹做前序遍歷 下面分別是遞歸&#xff0c;非遞歸&#xff0c;分治三種思路的解題結果 #遞歸寫法 class Solution(object):d…

一體化點焊機將要取代分體式焊鉗在汽車制造生產線上的使用

目前大多數汽車制造廠及相關配套鈑金件廠家選用的是懸掛式點焊機及分體式焊鉗&#xff0c;從焊接變壓器的功率參數看&#xff0c;約70 % 為160KVA 的&#xff0c;約30 % 為200 kVA 的。原因主要有兩方面&#xff0c;一是新材料如鍍鋅鋼板、高強度鋼板、鋁合金板的應用&#xff…

【python數字信號處理】——線性卷積

目錄 一、公式概念 二、代碼 1、numpy庫 2、自定義打印出每一步結果 三、結果 一、公式概念 線性卷積_百度百科線性卷積(linear convolution) 在時域描述線性系統輸入和輸出之間關系的一種運算。這種運算在線性系統分析和信號處理中應用很多&#xff0c;通常簡稱卷積。中文…

activiti web流程設計器 整合視頻 教程 SSM和獨立部署的方式

本視頻為activiti工作流的web流程設計器整合視頻教程整合Acitiviti在線流程設計器(Activiti-Modeler 5.21.0 官方流程設計器&#xff09;本視頻共講了兩種整合方式1. 流程設計器和其它工作流項目分開部署的方式2. 流程設計器和SSM框架項目整合在一起的方式視頻大小 1.13 GB ~【…

移動端判斷橫屏豎屏

1. CSS判斷橫屏豎屏 寫在同一個CSS中 media screen and (orientation: portrait) {   /*豎屏 css*/} media screen and (orientation: landscape) and (min-width:450px){   /*橫屏 css*/}分開寫在2個CSS 豎屏<link rel"stylesheet" media"all and (orie…

第五章 - 圖像形態學 - 基于圖像金字塔的圖像分割(cvPyrSegmentation)

本例程涉及到幾個數據結構及方法&#xff0c;CvMemStorage、cvPyrSegmentation()、CvConnectedComp、cvGetSeqElem(). CvMemStorage CvMemStorage Growing memory storage typedef struct CvMemStorage { struct CvMemBlock* bottom;/* first allocated block */ struct CvM…

泛型參數轉換的問題

泛型不同參數類型生成的對象是相互獨立的。 //如 Tuple<string> ts; Tuple<object> to; //ts to 是兩個類型的對象。很多時候&#xff0c;我們希望實現 to ts 這種操作&#xff0c;為什么&#xff1f;因為看上去它應該如此。 為了達到這個目的&#xff0c;就要解決…

【python數字信號處理】——循環卷積(也叫圓圈卷積)

目錄 一、公式 二、代碼 方法一:遍歷 方法二:利用卷積定理 一、公式