1. 程式人生 > 程式設計 >利用OpenCV中對影象資料進行64F和8U轉換的方式

利用OpenCV中對影象資料進行64F和8U轉換的方式

在OpenCV中很多對資料的運算都需要轉換為64F型別,比如伽瑪變換,這個很明顯要求冪的底數是double型別~

而cvShowImage()又要求是U8才能顯示,否則顯示出來是一片空白!

所以經常要進行轉換,怎麼做呢?看了下面的幾行程式碼你就知道了!

IplImage *pSrcImage = cvLoadImage("pout.jpg",CV_LOAD_IMAGE_UNCHANGED); 
IplImage *pGrayImage_8U = cvCreateImage(cvGetSize(pSrcImage),IPL_DEPTH_8U,1); 
IplImage *pGrayImage_8U_2 = cvCreateImage(cvGetSize(pSrcImage),1); 

IplImage *pGrayImage_64F=cvCreateImage(cvGetSize(pSrcImage),IPL_DEPTH_64F,1);

cvCvtColor(pSrcImage,pGrayImage_8U,CV_BGR2GRAY); //RGB轉灰度影象

cvConvertScale(pGrayImage_8U,pGrayImage_64F); //8U轉64F
cvConvertScale(pGrayImage_64F,pGrayImage_8U_2) //64F轉8U

補充知識:OpenCV中利用cvConvertScale()對影象資料作線性變換~

在OpenCV的IplImage結構體char * imageData成員的說明中,官方文件明確提示大家不能對這個指標所對應的資料直接操作,否則會帶來意想不到的錯誤。

原話是這樣的:

Do not assign imageData directly. Use SetData().

我曾經就犯傻直接進行操作,結果造成資料型別不匹配,最後還非得去修改標頭檔案中的char * imageData為unsigned char * imageData才解決問題,然而這種操作是極其不妥的~正確的做法是用OpenCV提供的各種函式來對影象資料就行操作!比如cvConvertScale()、Use SetData()之類的!

這裡我用cvConvertScale()來實現灰度影象的線性變換,程式非常簡潔,而且沒有任何問題!

原始碼如下:

#include <opencv2/opencv.hpp> 
#include <opencv2/legacy/compat.hpp> 
using namespace std; 
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

int main()
{
int i=0;
unsigned char *imageData_1;
unsigned char *imageData_2;
const char *pstrWindowsATitle = "原影象(opencv66.net)"; 
const char *pstrWindowsBTitle = "線性變換後的影象(opencv66.net))"; 
//從檔案中載入原圖 
IplImage *pSrcImage = cvLoadImage("coins.png",CV_LOAD_IMAGE_UNCHANGED); 
//建立輸出的影象
IplImage *pOutImage = cvCreateImage(cvGetSize(pSrcImage),1);
cvConvertScale(pSrcImage,pOutImage,2,-55); //利用cvConvertScale增加對比度的線性變換,線性變換中的比例因子k=2 偏移值b=-55
cvNamedWindow(pstrWindowsATitle,CV_WINDOW_AUTOSIZE); 
cvShowImage(pstrWindowsATitle,pSrcImage); 
cvNamedWindow(pstrWindowsBTitle,CV_WINDOW_AUTOSIZE); 
cvShowImage(pstrWindowsBTitle,pOutImage); 
cvWaitKey(0); 
cvDestroyWindow(pstrWindowsATitle); 
cvDestroyWindow(pstrWindowsBTitle); 
cvReleaseImage(&pSrcImage); 
cvReleaseImage(&pOutImage); 
return 0;
}

執行結果如下圖所示(和我在MATLAB中的執行結果一致哦)

利用OpenCV中對影象資料進行64F和8U轉換的方式

MATLAB執行後的結果

利用OpenCV中對影象資料進行64F和8U轉換的方式

以上這篇利用OpenCV中對影象資料進行64F和8U轉換的方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。