OpenCV2CXimage.h
01.#pragma once 02./* 03.* 类说明:OpenCV图像与CXimage图像互转 04.* 用于OpenCV的图像与CXimage图像格式互转进行封装。 OpenCV的图像位数必须是大等于8的整数倍,支持BMP,JPG图像格式;CXimage的图像位数可以是1、2、4、8、16、24,支持BMP,JPG,TIF,PNG,GIF图像格式。 05.*/ 06. 07.#include "unicode//ximage.h" 08.#pragma comment(lib, "cximage_unicode.lib") 09.//#pragma comment(lib, "j2k_unicode.lib") 10.#pragma comment(lib, "jasper_unicode.lib") 11.#pragma comment(lib, "jbig_unicode.lib") 12.#pragma comment(lib, "Jpeg_unicode.lib") 13.#pragma comment(lib, "png_unicode.lib") 14.#pragma comment(lib, "Tiff_unicode.lib") 15.#pragma comment(lib, "zlib_unicode.lib") 16.#pragma comment(lib, "mng_unicode.lib") 17.#pragma comment(lib, "libdcr_unicode.lib") 18. 19.#include "cv.h" 20.#include "cxcore.h" 21.#include "highgui.h" 22.#ifdef _DEBUG 23. #pragma comment(lib, "cxcore200d.lib") 24. #pragma comment(lib, "cv200d.lib") 25. #pragma comment(lib, "highgui200d.lib") 26.#else 27. #pragma comment(lib, "cxcore200.lib") 28. #pragma comment(lib, "cv200.lib") 29. #pragma comment(lib, "highgui200.lib") 30.#endif 31. 32.class OpenCV2CXimage 33.{ 34.public: 35. OpenCV2CXimage(void); 36. ~OpenCV2CXimage(void); 37. 38. /* 39. 功能说明: 获取黑点标记的方式 40. 参数说明: cxImage 图像处理类 41. 返回值: 黑点标记 42. */ 43. static int OpenCV2CXimage::GetBlackColor(CxImage cxImage); 44. 45. /* 46. 功能说明: 获取白点标记的方式 47. 参数说明: cxImage 图像处理类 48. 返回值: 黑点标记 49. */ 50. static int OpenCV2CXimage::GetWhiteColor(CxImage cxImage); 51. 52. /* 53. *功能说明:转换Cximage到IplImage(注:由于IplImage结构不支持图像像数非8位格式,所以强制转换成8位整数倍) 54. *参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 55. *返回值:bool类型。true,表示成功;flase,表示失败。 56. */ 57. bool Cximage2IplImage(CxImage *src,IplImage **dst); 58. 59. /* 60. *功能说明:转换IplImage到Cximage 61. *参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位](1,8,24); 62. *返回值:bool类型。true,表示成功;flase,表示失败。 63. */ 64. bool IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp=8); 65. 66. /* 67. *功能说明:图象格式转换 68. *参数说明:src,表示输入Cximage图像;dst,[out] 表示输出Cximage图像;imagetype,表示图象类型 69. *返回值:bool类型。true,表示成功;flase,表示失败。 70. */ 71. bool CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype = CXIMAGE_FORMAT_BMP); 72. 73.protected: 74. RGBQUAD *m_pPal;//调色版 75. int m_nPalatteCount; 76.};
01.#include "StdAfx.h" 02.#include "OpenCV2CXimage.h" 03.#include <map> 04.using namespace std; 05. 06.OpenCV2CXimage::OpenCV2CXimage(void) 07.{ 08. m_pPal = NULL; 09. m_nPalatteCount = 0; 10.} 11. 12.OpenCV2CXimage::~OpenCV2CXimage(void) 13.{ 14. if(m_pPal!=NULL) 15. { 16. delete []m_pPal; 17. m_pPal = NULL; 18. } 19.} 20. 21.//函数名: GetBlackColor 22.//功能: 获取黑点标记的方式 23.//参数: cxImage 图像处理类 24.//返回值: 黑点标记 25.int OpenCV2CXimage::GetBlackColor(CxImage cxImage) 26.{ 27. long i; 28. int iBlackFlag = 0; 29. RGBQUAD *pData = cxImage.GetPalette(); 30. long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD); 31. for(i=0;i<nPaletteSize;i++) 32. { 33. if(pData[i].rgbBlue==0 && pData[i].rgbGreen==0 && pData[i].rgbRed==0) 34. { 35. iBlackFlag = i; 36. break; 37. } 38. } 39. return iBlackFlag; 40.} 41. 42.//函数名: GetWhiteColor 43.//功能: 获取白点标记的方式 44.//参数: cxImage 图像处理类 45.//返回值: 黑点标记 46.int OpenCV2CXimage::GetWhiteColor(CxImage cxImage) 47.{ 48. long i; 49. int iWhiteFlag = 255; 50. RGBQUAD *pData = cxImage.GetPalette(); 51. long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD); 52. for(i=0;i<nPaletteSize;i++) 53. { 54. if(pData[i].rgbBlue==255 && pData[i].rgbGreen==255 && pData[i].rgbRed==255) 55. { 56. iWhiteFlag = i; 57. break; 58. } 59. } 60. return iWhiteFlag; 61.} 62. 63./* 64.*功能说明:转换Cximage到IplImage 65.*参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 66.*返回值:bool类型。true,表示成功;flase,表示失败。 67.*/ 68.bool OpenCV2CXimage::Cximage2IplImage(CxImage *src,IplImage **dst) 69.{ 70. bool bRet = true; 71. if(!src || !src->IsValid()) 72. { 73. bRet = false; 74. return bRet; 75. } 76. m_nPalatteCount = src->GetPaletteSize()/sizeof(RGBQUAD);; 77. m_pPal = src->GetPalette(); 78. int iBackColor = GetBlackColor(*src); 79. long i = 0,j = 0; 80. long nImageWidth = 0,nImageHeight = 0; 81. nImageWidth = src->GetWidth(); 82. nImageHeight = src->GetHeight(); 83. long nBitCunt = src->GetBpp(); 84. if(nBitCunt<=1) 85. { 86. *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1); 87. cvZero(*dst); 88. //转换Cximage to IplImage 89. for(j=0;j<nImageHeight;j++) 90. { 91. for(i=0;i<nImageWidth;i++) 92. { 93. if(src->GetPixelIndex(i,j)==iBackColor) 94. { 95. CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 0; 96. } 97. else 98. { 99. CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 255; 100. } 101. } 102. } 103. } 104. else if(nBitCunt<=8) 105. { 106. *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1); 107. cvZero(*dst); 108. //对应图像调色版与标准调色版的关系 109. map<int,int> mapPalatte; 110. RGBQUAD szSystemPal[256]; 111. int k = 0; 112. for(k=0;k<256;k++) 113. { 114. szSystemPal[k].rgbBlue = k; 115. szSystemPal[k].rgbGreen = k; 116. szSystemPal[k].rgbRed = k; 117. szSystemPal[k].rgbReserved = 0; 118. } 119. int m = 0; 120. for(m=0;m<m_nPalatteCount;m++) 121. { 122. for(k=0;k<256;k++) 123. { 124. if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed) 125. { 126. mapPalatte.insert(make_pair(m,k)); 127. break; 128. } 129. } 130. } 131. ////////////////////////////////////////////////////////////////////////// 132. 133. //转换Cximage to IplImage 134. map<int,int>::iterator iter; 135. BYTE btIndex = 0; 136. for(j=0;j<nImageHeight;j++) 137. { 138. for(i=0;i<nImageWidth;i++) 139. { 140. btIndex = src->GetPixelIndex(i,j); 141. iter = mapPalatte.find(btIndex); 142. if(iter!=mapPalatte.end()) 143. { 144. btIndex = iter->second; 145. } 146. CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = btIndex; 147. } 148. } 149. } 150. else if(nBitCunt<=16) 151. { 152. *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_16U,1); 153. (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格) 154. cvZero(*dst); 155. //转换Cximage to IplImage 156. for(j=0;j<nImageHeight;j++) 157. { 158. for(i=0;i<nImageWidth;i++) 159. { 160. BYTE *pSrc = src->GetBits(j) + 2*i; 161. CV_IMAGE_ELEM(*dst,ushort,j,i) = (*pSrc) + (*(pSrc+1))*256; 162. } 163. } 164. } 165. else //24色 166. { 167. *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,3); 168. (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格) 169. cvZero(*dst); 170. //转换Cximage to IplImag 171. memcpy((*dst)->imageData,src->GetBits(0),src->GetSize()); 172. } 173. return bRet; 174.} 175. 176./* 177.*功能说明:转换IplImage到Cximage 178.*参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位] 179.*返回值:bool类型。true,表示成功;flase,表示失败。 180.*/ 181.bool OpenCV2CXimage::IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp) 182.{ 183. bool bRet = true; 184. if(src==NULL || dst==NULL) 185. { 186. return false; 187. } 188. if(!(nBpp==1 || nBpp==8 || nBpp==24)) 189. { 190. return false; 191. } 192. long i = 0,j = 0; 193. CvSize csImageSize = cvGetSize(src); 194. CxImage ciTmp; 195. ciTmp.Create(csImageSize.width,csImageSize.height,src->depth,CXIMAGE_FORMAT_BMP); 196. if(src->depth== IPL_DEPTH_8U)//灰度 197. { 198. ciTmp.SetStdPalette(); 199. BYTE btIndex = 0; 200. for(j=0;j<csImageSize.height;j++) 201. { 202. for(i=0;i<csImageSize.width;i++) 203. { 204. btIndex = CV_IMAGE_ELEM(src,uchar,csImageSize.height-1-j,i); 205. ciTmp.SetPixelIndex(i,j,btIndex); 206. } 207. } 208. } 209. else //彩色 210. { 211. //转换IplImag to Cximage 212. memcpy(ciTmp.GetBits(0),src->imageData,src->imageSize); 213. } 214. 215. //转换成需要的目标图像 216. dst->Create(csImageSize.width,csImageSize.height,nBpp,CXIMAGE_FORMAT_BMP); 217. if(nBpp==ciTmp.GetBpp()) 218. { 219. dst->Copy(ciTmp); 220. } 221. else 222. { 223. if(nBpp==1)//二值 224. { 225. //对应图像调色版与标准调色版的关系 226. map<int,int> mapPalatte; 227. RGBQUAD szSystemPal[256]; 228. int k = 0; 229. for(k=0;k<256;k++) 230. { 231. szSystemPal[k].rgbBlue = k; 232. szSystemPal[k].rgbGreen = k; 233. szSystemPal[k].rgbRed = k; 234. szSystemPal[k].rgbReserved = 0; 235. } 236. int m = 0; 237. for(k=0;k<256;k++) 238. { 239. for(m=0;m<m_nPalatteCount;m++) 240. { 241. if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed) 242. { 243. mapPalatte.insert(make_pair(k,m)); 244. break; 245. } 246. } 247. } 248. ////////////////////////////////////////////////////////////////////////// 249. byte btValue = 0; 250. map<int,int>::iterator iter; 251. long nImageWidth = 0; 252. long nImageHeight = 0; 253. if(ciTmp.GetBpp()>8) 254. { 255. ciTmp.GrayScale(); 256. } 257. if(m_nPalatteCount==2) //表示原始的图象为二值图象 258. { 259. dst->SetPalette(m_pPal,m_nPalatteCount); 260. btValue = 0; 261. nImageWidth = ciTmp.GetWidth(); 262. nImageHeight = ciTmp.GetHeight(); 263. for(j=0;j<nImageHeight;j++) 264. { 265. for(i=0;i<nImageWidth;i++) 266. { 267. btValue = ciTmp.GetPixelIndex(i,j); 268. iter = mapPalatte.find(btValue); 269. if(iter!=mapPalatte.end()) 270. { 271. btValue = iter->second; 272. } 273. dst->SetPixelIndex(i,j,btValue); 274. } 275. } 276. } 277. else 278. { 279. ciTmp.Threshold(128); 280. dst->Copy(ciTmp); 281. } 282. } 283. else if(nBpp==8) 284. { 285. //对应图像调色版与标准调色版的关系 286. map<int,int> mapPalatte; 287. RGBQUAD szSystemPal[256]; 288. int k = 0; 289. for(k=0;k<256;k++) 290. { 291. szSystemPal[k].rgbBlue = k; 292. szSystemPal[k].rgbGreen = k; 293. szSystemPal[k].rgbRed = k; 294. szSystemPal[k].rgbReserved = 0; 295. } 296. int m = 0; 297. for(k=0;k<256;k++) 298. { 299. for(m=0;m<m_nPalatteCount;m++) 300. { 301. if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed) 302. { 303. mapPalatte.insert(make_pair(k,m)); 304. break; 305. } 306. } 307. } 308. ////////////////////////////////////////////////////////////////////////// 309. byte btValue = 0; 310. map<int,int>::iterator iter; 311. long nImageWidth = 0; 312. long nImageHeight = 0; 313. if(ciTmp.GetBpp()!=8) 314. { 315. ciTmp.GrayScale(); 316. } 317. if(m_nPalatteCount==8) //表示原始的图象为灰度图象 318. { 319. dst->SetPalette(m_pPal,m_nPalatteCount); 320. btValue = 0; 321. nImageWidth = ciTmp.GetWidth(); 322. nImageHeight = ciTmp.GetHeight(); 323. for(j=0;j<nImageHeight;j++) 324. { 325. for(i=0;i<nImageWidth;i++) 326. { 327. btValue = ciTmp.GetPixelIndex(i,j); 328. iter = mapPalatte.find(btValue); 329. if(iter!=mapPalatte.end()) 330. { 331. btValue = iter->second; 332. } 333. dst->SetPixelIndex(i,j,btValue); 334. } 335. } 336. } 337. else 338. { 339. dst->Copy(ciTmp); 340. } 341. } 342. else 343. { 344. if(ciTmp.GetBpp()==24) 345. { 346. dst->Copy(ciTmp); 347. } 348. else 349. { 350. byte btValue = 0; 351. COLORREF clValue; 352. map<int,int>::iterator iter; 353. long nImageWidth = 0; 354. long nImageHeight = 0; 355. bRet = ciTmp.IncreaseBpp(24); 356. dst->Copy(ciTmp); 357. } 358. } 359. } 360. return bRet; 361.} 362. 363.//图象格式转换 364.bool OpenCV2CXimage::CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype) 365.{ 366. bool bRet = true; 367. if(src==NULL || dst==NULL) 368. { 369. return false; 370. } 371. if(!(imagetype>0 && imagetype<=19)) 372. { 373. return false; 374. } 375. if(src->GetType()==imagetype) 376. { 377. dst->Copy(*src); 378. } 379. else 380. { 381. dst->Create(src->GetWidth(),src->GetHeight(),src->GetBpp(),imagetype); 382. src->SetType(imagetype); 383. dst->Copy(*src); 384. } 385. return true; 386.}