opencv——访问图像元素(imagedata widthstep)

opencv——访问图像元素(imagedata widthstep)http://blog.sina.com.cn/s/blog_759803690101gtpx.html怎么访问图像元素(坐标起点相对于图像原点 image origin 从 0 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL) 假设有 8-bit 1-通道的图像 I (IplIma

大家好,又见面了,我是你们的朋友全栈君。

http://blog.sina.com.cn/s/blog_759803690101gtpx.html

怎么访问图像元素
(坐标起点相对于图像原点 image origin 从 开始,或者是左上角 (img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL) 

假设有 8-bit 1-通道的图像 (IplImage* img): 
I(x,y) ((uchar*)(img->imageData img->widthStep*y))[x]

假设有 8-bit 3-通道的图像 (IplImage* img): 
I(x,y)blue ((uchar*)(img->imageData img->widthStep*y))[x*3]
I(x,y)green ((uchar*)(img->imageData img->widthStep*y))[x*3+1]
I(x,y)red ((uchar*)(img->imageData img->widthStep*y))[x*3+2]

如果增加点 (100,100) 的亮度 30 ,那么可以: 
CvPoint pt {100,100};
((uchar*)(img->imageData img->widthStep*pt.y))[pt.x*3] += 30;
((uchar*)(img->imageData img->widthStep*pt.y))[pt.x*3+1] += 30;
((uchar*)(img->imageData img->widthStep*pt.y))[pt.x*3+2] += 30;

或者更有效的 
CvPoint pt {100,100};
uchar* temp_ptr &((uchar*)(img->imageData img->widthStep*pt.y))[x*3];
temp_ptr[0] += 30;
temp_ptr[1] += 30;
temp_ptr[2] += 30;

假设有 32-bit 浮点数, 1-通道 图像 (IplImage* img): 
I(x,y) ((float*)(img->imageData img->widthStep*y))[x]

现在,通用方法:假设有 N-通道,类型为 的图像:
I(x,y)c ((T*)(img->imageData img->widthStep*y))[x*N c]
或者你可使用宏 CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc )
I(x,y)c CV_IMAGE_ELEM( img, T, y, x*N )

也有针对各种图像(包括 4-通道)和矩阵的函数(cvGet2D, cvSet2D), 但是它们都很慢. 
——————————————————————————–

如何访问矩阵元素?
方法是类似的 (都是针对 起点的列和行) 

设有 32-bit 浮点数的实数矩阵 (CvMat* mat): 
M(i,j) ((float*)(mat->data.ptr mat->step*i))[j]

设有 64-bit 浮点数的复数矩阵 (CvMat* mat): 
Re M(i,j) ((double*)(mat->data.ptr mat->step*i))[j*2]
Im M(i,j) ((double*)(mat->data.ptr mat->step*i))[j*2+1]

设有单通道矩阵,有宏 CV_MAT_ELEM( matrix, elemtype, row, col ), 例如对 32-bit 浮点数的实数矩阵
M(i,j) CV_MAT_ELEM( mat, float, i, ),
假如初始化 3×3 单位阵:
CV_MAT_ELEM( mat, float, 0, 1.f;
CV_MAT_ELEM( mat, float, 0, 0.f;
CV_MAT_ELEM( mat, float, 0, 0.f;
CV_MAT_ELEM( mat, float, 1, 0.f;
CV_MAT_ELEM( mat, float, 1, 1.f;
CV_MAT_ELEM( mat, float, 1, 0.f;
CV_MAT_ELEM( mat, float, 2, 0.f;
CV_MAT_ELEM( mat, float, 2, 0.f;
CV_MAT_ELEM( mat, float, 2, 1.f;

——————————————————————————–

如何在 OpenCV 中处理我自己的数据
设你有 300×200 32-bit 浮点数 image/array, 也就是对一个有 60000 个元素的数组. 

int cols 300, rows 200;
float* myarr new float[rows*cols];

// step 1) initializing CvMat header
CvMat mat cvMat( rows, cols,
                   CV_32FC1, // 32-bit floating-point, single channel type
                   myarr // user data pointer (no data is copied)
                   );
// step 2) using cv functions, e.g. calculating l2 (Frobenius) norm
double norm cvNorm( &mat, 0, CV_L2 );


delete myarr;

其它情况在参考手册中有描述.见 cvCreateMatHeader, cvInitMatHeader, cvCreateImageHeader, cvSetData etc. 
——————————————————————————–

如何加载和显示图像

#include “cv.h”
#include “highgui.h”

int main( int argc, char** argv )
{

    IplImage* img;
    if( argc == && (img cvLoadImage( argv[1], 1)) != )
    {

        cvNamedWindow( “Image view”, );
        cvShowImage( “Image view”, img );
        cvWaitKey(0); // very important, contains event processing loop inside
        cvDestroyWindow( “Image view” );
        cvReleaseImage( &img );
        return 0;
    }
    return -1;
}

 

void cvLaplace (IplImage* src, IplImage* dst, int apertureSize=3);
void cvSobel (IplImage* src, IplImage* dst, int dx, int dy, int apertureSize=3);
void cvCanny (IplImage* img, IplImage* edges, double lowThresh, double highThresh, int apertureSize=3);

void cvPreCornerDetect (IplImage* img, IplImage* corners, Int apertureSize);
void cvCornerEigenValsAndVecs (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3);
void cvCornerMinEigenVal (IplImage* img, IplImage* eigenvv, int blockSize, int apertureSize=3);
void cvGoodFeaturesToTrack (IplImage* image, IplImage* eigImage, IplImage* tempImage, CvPoint2D32f* corners, int* cornerCount, double qualityLevel,double minDistance);
//对已经粗检测出的角点进行亚像素精准定位
void cvFindCornerSubPix (IplImage* img, CvPoint2D32f* corners, int count,CvSize win, CvSize zeroZone, CvTermCriteria criteria);

//金字塔分解与重构
void cvPyrDown (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5);
void cvPyrUp (IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5);

void cvThreshold (IplImage* src, IplImage* dst, float thresh, float maxvalue,CvThreshType type);

void cvProject3D CvPoint3D32f* points3D, int count, CvPoint2D32f* points2D,int xindx, int yindx);

void cvFindFundamentalMatrix (int* points1, int* points2, int numpoints, int method, CvMatrix3* matrix);

//很好用的平滑函数
void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 );
CV_BLUR_NO_SCALE CV_BLUR CV_GAUSSIAN CV_MEDIAN CV_BILATERAL

其他辅助函数:
void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color );

cvCvtColor(image, gray, CV_BGR2GRAY);//彩色图像灰度化

cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, currentimage);
cvSplit(colorimage,plane[0],plane[1],plane[2],0);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134403.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【报错解决办法】ModuleNotFoundError: No module named ‘numba‘[通俗易懂]

    【报错解决办法】ModuleNotFoundError: No module named ‘numba‘[通俗易懂]numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。python之所以慢,是因为它是靠CPython编译的,numba的作用是给python换一种编译器。numba可以基于llvm动态生成优化代码,提高python的执行效率,只需要给python代码加上修饰器就好了。如果遇到ImportError:Nomodulenamednumba这样的问题,安装nu

    2022年10月23日
  • WinForm 界面美化

    WinForm 界面美化主界面的扁平化更改winform自带的MainForm窗体属性将主窗体FormBorderStyle更改为None,这样就得到了一个无边框的窗体调节背景色,找到自己喜欢的颜色,输入到BackColor属性中在主窗体的Mouse_Down中添加如下事件,实现窗体随意拖动:[DllImport(“user32.dll”)]publicstaticexternboolReleaseCapture();[DllImport(“user32.dll”)]publicstatic

  • 高手入门STM32总结+学习步骤

    高手入门STM32总结+学习步骤一、入门总结1.1为什么要把时间花在“犹豫”上?每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。大家可能是从51单片机过来的,回想一…

  • android系统webview最新版本_webview加载h5页面空白

    android系统webview最新版本_webview加载h5页面空白做android聊天时,遇到过一个问题,h5的页面发送的图片在android端不能响应,ios那边一路畅通。也是相当无奈,目前发现了好多android端与ios端webView的异同。android端与ios确的不同大致包括:1:android不能直接打开html的下载文件,需要先下载保存本地在打开本地文件2:android不能直接打开pdf文件,同样要下载再打开3:如题,h5页面的发送图片按钮点…

  • 网络体系结构与网络协议

    网络体系结构与网络协议

  • oracle视图如何创建索引,ORACLE 创建视图索引序列[通俗易懂]

    oracle视图如何创建索引,ORACLE 创建视图索引序列[通俗易懂]/*视图View视图是从若干基本表和(或)其他视图构造出来的表视图存放的都是查询语句,并没有真实的数据虚表作用限制对数据的操作复杂查询变简单提供相同数据的不同显示UNIONALL直接添加到一起UNION添加到一起并去重*/–赋予scott用户创建视图的权限sqlplus/assysdba;GRANTCREATEVIEWTOSCOTT;–创建视图CREATEORREPLACE…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号