opencv:image->imageData+image->widthStep*i)[j]表达式含义

opencv:image->imageData+image->widthStep*i)[j]表达式含义代码含义image->imageData+image->widthStepi)[j]就是得到image图像中第i行第j列的像素值。一开始ptr[Rows]=255;显示的结果不是中心5050区域,后来查阅资料得知要用三通道的表达方式ptr[3*Rows]=0;//Rptr[3*Rows+1]=0;//Gptr[3*Rows+2]=0;//…

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

代码含义

image->imageData+image->widthStep*i)[j] 就是得到image图像中第i行第j列的像素值。

一开始ptr[Rows] = 255;显示的结果不是中心50*50区域,后来查阅资料得知要用三通道的表达方式

ptr[3 * Rows] = 0;//R
ptr[3 * Rows + 1] = 0;//G
ptr[3 * Rows + 2] = 0;//B

完整代码如下:

#include "stdafx.h"
#include "convert.h"
#include "convertDlg.h"
#include "afxdialogex.h"
#include "cv.h"
#include "highgui.h" 
#include <stdio.h> 
#include <cxcore.h>
#include <stdbool.h>
//#include "CvvImage.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

IplImage *src = NULL;
IplImage *src1 = NULL;
IplImage *dst = NULL;
IplImage *MultiImage = NULL;

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CconvertDlg 对话框



CconvertDlg::CconvertDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CONVERT_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CconvertDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CconvertDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CconvertDlg::OnBnClickedButton1)
	//ON_BN_CLICKED(IDC_BUTTON2, &CconvertDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON2, &CconvertDlg::OnBnClickedButton2)
END_MESSAGE_MAP()


// CconvertDlg 消息处理程序

BOOL CconvertDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CconvertDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CconvertDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CconvertDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CconvertDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
		unsigned char cWaitKeyValue, Rows, Cols;
		src = cvLoadImage("1.png", 1);
		//src = cvCreateImage(cvSize(100, 100), IPL_DEPTH_8U, 1);
		//cvZero(src);
		int nHeight;
		int nWidth;
		nHeight = src -> height;
		nWidth = src -> width;
		char *ptr = NULL;
		for (Cols = ((nWidth / 2) - 25); Cols < ((nWidth / 2) +25); Cols++)
		{
			ptr = src->imageData + Cols * src->widthStep;
			for (Rows = ((nHeight / 2) -25); Rows < ((nHeight / 2) + 25); Rows++)
			{
				ptr[3 * Rows] = 0;//R
				ptr[3 * Rows + 1] = 0;//G
				ptr[3 * Rows + 2] = 0;//B

				//ptr[Rows] = 255;
			}
		}
		cvNamedWindow("Filter", 1);
		cvShowImage("Filter", src);
		cvWaitKey(0);

}




void CconvertDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	src1 = cvLoadImage("1.png", 1);
	cvNamedWindow("original", 1);
	cvShowImage("original", src1);
	cvWaitKey(0);

}

运行结果

在这里插入图片描述

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143083.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月22日 上午11:40
下一篇 2022年5月22日 上午11:40


相关推荐

  • 轻松上手!n8n安装流程指南及常见问题解决方案

    轻松上手!n8n安装流程指南及常见问题解决方案

    2026年3月14日
    2
  • word转pdf的java实现_java实现word转pdf

    word转pdf的java实现_java实现word转pdf文章时间:2020-12-516:38:54解决问题:java实现word转pdf目前发现可用的实现方式有两种,一种是使用e-iceblue的免费版api,此方法最为简单但存在限制,导出页数不能超过三页。另一种是使用openoffice,但较上一种方法麻烦一些,需要安装openoffice的软件,但没有导出限制,请根据自身需求自行选用。方式一e-iceblue的免费版api官方文档https:…

    2022年6月8日
    117
  • python生成随机姓名

    python生成随机姓名在看 csdn 的时候无意看到一篇使用 java 生成随机中国姓名的文章 由于最近在学习 python 就想着我也使用 python 写一个玩玩下面附上代码 Chenyicheng 创建时间 2019 6 1414 09 importrandom name 删减部分 比较大众化姓氏 firs

    2026年3月17日
    1
  • latex的参考文献写法标准_endnote怎么修改参考文献编号格式

    latex的参考文献写法标准_endnote怎么修改参考文献编号格式LaTeX参考文献的排版与引用​ 在论文写作的过程中,为了体现论文的科学性、严谨性和规范性,我们常常需要引用大量的参考文献来引证自己的观点。参考文献(Reference)往往都是放在论文的最后,记录了所引用论文的标题、作者、期刊或会议、出版时间等信息,文中还需要明确有顺序的进行引用标注。​ 本篇将介绍LaTeX常用的参考文献排版与引用方式,所用到的宏包都要写在\documentclass命令之后和\begin{docuemnt}之前,在本文中,我们会用的宏包文件有:\usepackag

    2025年10月13日
    4
  • linux下pycharm教育版安装汉化

    linux下pycharm教育版安装汉化1 linux 安装 pycharm 官网直接下载 linux 下的安装包 教育版好像不需要激活成功教程路径 https www jetbrains com pycharm edu download download thanks html platform linux 上传到 linux 下直接解压即可解压完毕后进入 bin 目录执行 pycharm sh 进行安装使用 以后每

    2026年3月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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