C++Builder用OpenCV和TBitmap显示图片

ooolinux 2020-11-07 08:25:46
百度到的代码:
if (dlgOpenPic->Execute()) // 使用TOpenDialog控件选择文件
{
IplImage *pImage = cvLoadImage(dlgOpenPic->FileName.c_str(),CV_LOAD_IMAGE_COLOR) ; // 使用OPENCV函数载入图片
if(pImage == NULL)
return ;
cvFlip(pImage) ;
int nWidth = pImage->width ;
int nHeight = pImage->height ;
imgShowPic->Picture->Bitmap->Width = nWidth ;
imgShowPic->Picture->Bitmap->Height = nHeight ;
imgShowPic->Picture->Bitmap->PixelFormat = pf24bit ; // 设置图片为24色显示
memcpy(imgShowPic->Picture->Bitmap->ScanLine[nHeight - 1],pImage->imageData,pImage->imageSize) ; // 将载入的图片数据写入Timage控件中。

cvReleaseImage(&pImage); // 最后要释放这个句柄。
}

这样就可以显示任何格式的图片了。
——————————
老概看看这个代码有没有问题?
cvFlip(pImage) ;
memcpy(imgShowPic->Picture->Bitmap->ScanLine[nHeight - 1],pImage->imageData,pImage->imageSize) ;
这两行代码什么原理?ScanLine[nHeight - 1]是最低地址?BMP扫描线是反向的?
...全文
656 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2020-11-13
  • 打赏
  • 举报
回复
引用 16 楼 早打大打打核战争 的回复:
lib、dll、exe等等

了解了。
  • 打赏
  • 举报
回复
lib、dll、exe等等
ooolinux 2020-11-12
  • 打赏
  • 举报
回复
引用 14 楼 早打大打打核战争 的回复:
有,OpenCV源码+build

build是指生成的DLL或EXE文件?
  • 打赏
  • 举报
回复
有,OpenCV源码+build

ooolinux 2020-11-12
  • 打赏
  • 举报
回复
引用 12 楼 早打大打打核战争 的回复:
OpenCV本身不带预编译的DLLs,但是有第三方编译好的库:https://sourceforge.net/projects/opencvlibrary/,Project Activity下面

这些库是包括DLL和头文件吗?头文件里有没有函数调用方式比如__stdcall之类的说明?
  • 打赏
  • 举报
回复
OpenCV本身不带预编译的DLLs,但是有第三方编译好的库:https://sourceforge.net/projects/opencvlibrary/,Project Activity下面
  • 打赏
  • 举报
回复
最新OpenCV是4.5,CB静态链接估计还是有问题,不过用DLL导出的C库功能是可以的
ooolinux 2020-11-11
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
好像是3.0

可惜新的不更新了。不知道C++Builder用cmake原生编译OpenCV源代码有没有新进展?
ooolinux 2020-11-11
  • 打赏
  • 举报
回复
引用 10 楼 早打大打打核战争 的回复:
最新OpenCV是4.5,CB静态链接估计还是有问题,不过用DLL导出的C库功能是可以的

OpenCV自带这些DLL吗?
  • 打赏
  • 举报
回复
好像是3.0
ooolinux 2020-11-10
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
还没有,据说这个修改版OpenCV源码可以用CB编译通过:https://github.com/boaz001/opencv

这个修改版对应于OpenCV的什么版本?
  • 打赏
  • 举报
回复
还没有,据说这个修改版OpenCV源码可以用CB编译通过:https://github.com/boaz001/opencv
  • 打赏
  • 举报
回复
这二者RGB数据字节序有没有可能会颠倒的,一个RGB,一个BGR排列?
===========================================
未知,但是道理上应该不会,既然它转换成windows位图格式,应该按照BITMAP的字节顺序

ScanLine[nHeight - 1]为什么是数据最低地址?
============================
因为DIB是bottom->top存储的,最下一条扫描线的数据最先存储
ooolinux 2020-11-09
  • 打赏
  • 举报
回复
引用 4 楼 早打大打打核战争 的回复:
这二者RGB数据字节序有没有可能会颠倒的,一个RGB,一个BGR排列?
===========================================
未知,但是道理上应该不会,既然它转换成windows位图格式,应该按照BITMAP的字节顺序

ScanLine[nHeight - 1]为什么是数据最低地址?
============================
因为DIB是bottom->top存储的,最下一条扫描线的数据最先存储

老概有没有OpenCV环境可以试一下这个代码?
ooolinux 2020-11-08
  • 打赏
  • 举报
回复
引用 2 楼 早打大打打核战争 的回复:
应该是可以的吧,cvLoadImage(dlgOpenPic->FileName.c_str(),CV_LOAD_IMAGE_COLOR) 把图像转换成了RGB3通道位图格式,也就是24位位图,然后上下翻转一下,因为VCL的TBitmap建立的位图默认是DIB,是bottom->top顺序存储的

我百度了一下,CV_LOAD_IMAGE_COLOR :图像转为彩色图(BGR,3通道)
Bitmap->PixelFormat = pf24bit ;
这二者RGB数据字节序有没有可能会颠倒的,一个RGB,一个BGR排列?
ScanLine[nHeight - 1]为什么是数据最低地址?
  • 打赏
  • 举报
回复
应该是可以的吧,cvLoadImage(dlgOpenPic->FileName.c_str(),CV_LOAD_IMAGE_COLOR) 把图像转换成了RGB3通道位图格式,也就是24位位图,然后上下翻转一下,因为VCL的TBitmap建立的位图默认是DIB,是bottom->top顺序存储的
ooolinux 2020-11-07
  • 打赏
  • 举报
回复

BCB中使用opencv显示图片
zh516846937 2011-11-23 17:35:36 2771 收藏
文章标签: 工作 image null
版权

新建一个工程,向工程中添加一个Timage控件(dlgOpenPic),一个TOpenDialog控件(dlgOpenPic),一个按钮。

在头文件中加入以下语句:
#include <assert.h> // 这是用OPENCV必须要用到的文件
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#pragma link "cv200.lib"
#pragma link "cxcore200.lib"
#pragma link "highgui200.lib"
这是加入所需的头文件和LIB库,然后再将cv200.dll,cxcore200.dll,highgui200.dll放入工作目录中。
这些做完之后就要设置工程了:
配置工作:
Project->Options->"Directories/Conditionals"
Conditionals:_DEBUG;SKIP_INCLUDES (添加SKIP_INCLUDES)。
这些都设置好之后就是写代码了。

在按钮的单击事件上添加如下代码:

if (dlgOpenPic->Execute()) // 使用TOpenDialog控件选择文件
{
//代码在主楼

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧