OpenCV中DrawtoHDC显示ROI错位问题.docVIP

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenCV中DrawtoHDC显示ROI错位问题

OpenCV中DrawtoHDC显示ROI错位问题 CvvImage的成员函数void CImage::DrawToHDC HDC hDCDst, RECT* pDstRect ;是用来把一幅影像ROI显示到DC上的函数,如果pDstRect尺寸与ROI尺寸一致的话,没有任何问题可以正常显示。但是,如果两者尺寸不一致,则会发生错位,仔细观察,可以发现其实是原来的ROI坐标原点取自默认的左上角,而利用DrawtoHDC时坐标原点取在了左下角。原因何在?先看代码: [code]void CImage::DrawToHDC HDC hDCDst, RECT* pDstRect if pDstRect m_img m_img- depth IPL_DEPTH_8U m_img- imageData uchar buffer[sizeof BITMAPINFOHEADER + 1024]; BITMAPINFO* bmi BITMAPINFO* buffer; int bmp_w m_img- width, bmp_h m_img- height; CvRect roi cvGetImageROI m_img ; CvRect dst RectToCvRect *pDstRect ; if roi.width dst.width roi.height dst.height Show hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y ; return; if roi.width dst.width SetStretchBltMode hDCDst, // handle to device context HALFTONE ; else SetStretchBltMode hDCDst, // handle to device context COLORONCOLOR ; FillBitmapInfo bmi, bmp_w, bmp_h, Bpp , m_img- origin ; ::StretchDIBits hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y, roi.width, roi.height, m_img- imageData, bmi, DIB_RGB_COLORS, SRCCOPY ; [/code] 很明显,如果ROI和目标矩形尺寸一致,则调用OpenCV自身的函数void CvvImage::Show HDC dc, int x, int y, int w, int h, int from_x, int from_y ;来显示,这个是将图像指定部分显示到DC上的函数,坐标原点是仍是左上角,显示没有问题。但如果二者尺寸不一,那么将调用MFC的函数int StretchDIBits HDC hdc, int XDest , int YDest , int nDestWidth, int nDestHeight, int XSrc, int Ysrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo, UINT iUsage, DWORD dwRop ;来实现显示,这个函数是专门设计显示BMP位图的函数,坐标原点是左下角,而以上代码却并没有改化原始ROI图像的坐标原点就进行了直接的显示,因此才会导致一开始交代的问题。 我觉得这个问题不能在外部解决的原因是: 我们固然可以在外部修改DrawtoHDC函数中FillBitmapInfo bmi, bmp_w, bmp_h, Bpp , m_img- origin ;的参数m_img- origin 1,这样把坐标原点改化为左下角,但这又会导致另一个问题:的确正确取出了ROI区域,但是显示的影像是原来的ROI沿y方向的镜像!原因是,修改了m_img- origin参数后,待显示位图的头文件信息bmi指定了m_img- imageData读取顺序,于是可以正确取出原始ROI对应的图像数据,然而这并没有真正改变m_img- imageData的存储顺序,所以出现镜像问题。如下图所示,II代表默认情况,I代表改化情况,两种情况下,实际的存储结构都没有发生变化。

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档