1. 程式人生 > >osg與OpenCV影象互轉

osg與OpenCV影象互轉

因研究需要,這幾天想把Opecv獲取的視訊幀轉到OSG中作為紋理背景輸出,關鍵的一步就是Opencv幀影象的傳遞。

那麼問題來了:Opencv存放影象資料的格式和OSG的差異大嗎?

因為自己也是個新手,首先找到了

osg抓幀放到openCV裡

http://wenku.baidu.com/link?url=PXeAHmmV7vyA7s2fEK30_gEQvJzpHA9uDl9y1YIUHstCXCj_HKOTGjs_5PMnesuFDocCapTlBOyp5UjzWDu0LE7VayoDq98X3jzpPpyiQCm

原作者無從可考,但是留下了一句重要的程式碼:

memcpy((unsigned char*)pIplImg->imageData,pCImg->data(),pCImg->getImageSizeInBytes());

給出的資訊就是兩者資料轉換,只要知道長和寬,以及畫素資料的指標位置就可以了。完整的程式碼如下:

IplImage* CImage2IplImage(osg::ref_ptr<osg::Image> pCImg,IplImage *pIplImg){ //輸出影象設定 pIplImg->origin=IPL_ORIGIN_BL; //輸入影象資訊 memcpy((unsigned char*)pIplImg->imageData,pCImg->data(),pCImg->getImageSizeInBytes()); //將RGB儲存為BGR unsigned int
temp=0; for (int y=0;y<pIplImg->height;y++) { uchar* ptr=(uchar*)(pIplImg->imageData+y*pIplImg->widthStep); for (int x=0;x<pIplImg->width;x++) { temp=ptr[3*x];//儲存原始的R值 ptr[3*x]=ptr[3*x+2]; ptr[3*x+2]=temp; } } return pIplImg;}

順藤摸瓜,再重申下我的目的是Opencv的圖轉成OSG的,因為配置了Opencv2.0,所以使用了最新的影象格式Mat(同時包括了老版本的IplImage和cvMat)

於是任務變成:Opencv Mat->OSG::Image

去Image看建構函式,只有setImage中要求設定長款和char* data,資料格式相符。OSG原始碼:

/** Set the image dimensions, format and data. */
        virtual void setImage(int s,int t,int r,
                      GLint internalTextureformat,
                      GLenum pixelFormat,GLenum type,
                      unsigned char* data,
                      AllocationMode mode,
                      int packing=1, int rowLength=0);
之後試了一下居然成了。我的程式碼: osg::ref_ptr<osg::Image> mat2img::mat2image(Mat cvimg){ osgframe=new osg::Image; osgframe->setImage(cvimg.cols,cvimg.rows,3, GL_BGR,GL_BGR,GL_UNSIGNED_BYTE,cvimg.data, osg::Image::NO_DELETE,1); if(osgframe) printf("convert done!"); osgDB::writeImageFile(*osgframe,"D:\\OV2OV\\OV2OV\\osgframe.bmp"); return osgframe;}

除錯輸出的圖片和文字資訊全部正確。

之後就是重新加工視訊流了,用osg紋理貼圖即可。

相關推薦

osgOpenCV影象

因研究需要,這幾天想把Opecv獲取的視訊幀轉到OSG中作為紋理背景輸出,關鍵的一步就是Opencv幀影象的傳遞。 那麼問題來了:Opencv存放影象資料的格式和OSG的差異大嗎? 因為自己也是個新手,首先找到了 osg抓幀放到openCV裡 http://wenku.ba

影象RGB2YUVYUV2RGB格式介紹

1 YUV格式與RGB格式說明   由於不同國家的電視訊號系統支援的影象格式不同,有YUV格式成像,也有RGB格式成像,因此為了保證相容性,需要進行RGB與YUV格式的互轉。 另外YUV格式具有亮度資訊和色彩資訊分離的特點,但大多數影象處理操作都是基於RGB格式,需要將RGB格式轉

Java中net.sf.json包關於JSON對象的坑

一句話 declared bean == float 谷歌 數據類型 運行時 定制   在Web開發過程中離不開數據的交互,這就需要規定交互數據的相關格式,以便數據在客戶端與服務器之間進行傳遞。數據的格式通常有2種:1、xml;2、JSON。通常來說都是使用JSON來傳遞數

集合數組

代碼 ons ace 表示 但是 漢字 運用 修改 style   一.集合轉數組   以ArrayList集合為例,使用該集合的一個成員方法toArray(),可以將一個集合對象轉化為一個數組。如下所示:   1 void listToArray(){ 2

java 字符ASCII碼

方法 style println span har pos system pan blog 字符轉對應ASCII碼 // 方法一:將char強制轉換為byte char ch = ‘A‘; byte byteAscii = (byte) ch; System.out.

縱表橫表實例

sum 代碼 sql help blog 所有 .cn light div 1.縱表轉橫表: 縱表結構:Table1 轉換後的橫表結構: Sql示例代碼: ? 1 2 3 4 5 6 7 8 9 10 11 select username, sum

gensimnumpy array

字母轉 IT aid coo tool rdo ont array dense 目的 將gensim輸出的格式轉化為numpy array格式,支持作為scikit-learn,tensorflow的輸入 實施 使用nltk庫的停用詞和網上收集的資料整合成一份新的停用詞

SQL縱表橫表

padding else 結束 esc ase when sum -a order 1.縱表轉橫表: 縱表結構:Table1 轉換後的橫表結構: Sql示例代碼: select username, sum(case Course when ‘語文‘ t

JDK1.8 LocalDateTime 時間類字符

nth formatter ear class light 大小寫 orm ava 1.8 public static void main(String[] args) { DateTimeFormatter dateTimeFormatter=Date

javascriptphp時/分/秒秒數

cond log pre UNC ole arr 時間 min seconds javascript: /* 時間轉換成秒 */ function time_to_second(time){ var arr = time.split(‘:‘) var hour = arr[

CAD小技巧-怎麽將DWGDXF進行

ima dde 電腦 菜單欄 轉換 希望 拖拽 -o 朋友 CAD小技巧,怎麽將DWG與DXF進行互轉?在CAD行業中小夥伴們都知道,他們每天的日常工作就是編輯CAD圖紙文件,以前的CAD前輩們都是用手繪制的,但是隨著科技的發展,現在編輯CAD圖紙一般都是借助CAD編輯器來

IOS中的NSStringNSArray的

將string字串轉換為array陣列  NSArray  *array = [Str componentsSeparatedByString:@","];//分隔符逗號 將array陣列轉換為string字串 &n

js字元ASCII碼的方法

大寫字母A-Z對應的ASCII碼值是65-90 小寫字母a-z對應的ASCII碼值是97-122 將字母轉為ascii嘛的方法: var str = "A"; str.charCodeAt(); // 65 var str1 = 'a'; str1.charCodeAt()

xstream--xml工具類--java物件轉換JSONObject、xmljava物件

工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;

CAD小技巧-怎麼將DWGDXF進行

CAD小技巧,怎麼將DWG與DXF進行互轉?在CAD行業中小夥伴們都知道,他們每天的日常工作就是編輯CAD圖紙檔案,以前的CAD前輩們都是用手繪製的,但是隨著科技的發展,現在編輯CAD圖紙一般都是藉助CAD編輯器來進行繪製,既方便又快捷,但是編輯出來的CAD圖紙都是dwg格式的,這樣不利用我們進行檢視,那怎麼

java 可變引數,集合陣列的,靜態匯入

可變引數 可變引數是如果型別確定,引數個數不確定,需要用可變引數來定義,引數的具體個數在方法呼叫時才能確定java把可變引數當做陣列處理 可變引數的定義是jdk1.5加入的,比如main方法 public static void main(String [] args) 特點:

IOS編碼GB2312UTF-8

GB2312轉換為UTF-8的方法 + (NSData *)UTF8WithGB2312Data:(NSData *)gb2312Data { NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding

C#中DataTableList的

1、建立DataTable擴充套件方法類(DataTableExtend.cs) using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace My

時間戳時間字串的工具類

這是專案經常用到的時間戳與時間字串互轉的工具類,記錄於此。 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public final class

檔案base64 字串

這是專案中用到的檔案與base64字串互轉的工具,記錄於此。 import android.util.Base64; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre