在MFC中使用OpenCV2.3.1

2023-10-27


最近要做数字图像处理的项目,大家都说VS+MFC+OpenCV很好用,于是我就试着弄了下。首先我到OpenCV ChinaOpenCV中文版主页找了一些很不错的教程开始做了。我用的是Visual Studio 2005,OpenCV的版本是2.3.1。但是OpenCV China里好像只有关于VS2005基础上的较低版本的OpenCV的环境搭建方法,或者VS2008、VS2010等平台上才介绍了OpenCV2.0以上的版本环境搭建。由于我使用过VS2010、VS2005,感觉两个编译器相比于VS2005和VC6.0的差别还是很小的,于是我就按照在VS2008/VS2010上建立OpenCV2.3.1环境的方法在VS2005上成功建立了OpenCV2.3.1的环境。
下一步我就开始做基于MFC的OpenCV变成了,我是按照OpenCV China上的相关教程并参考了很多帖子做的快速在MFC中使用OpenCV,我几乎是一步一步的模仿,然后还是报了不少错误。为了修改这些Bug,我真是费劲了九牛二虎之力才搞定。现将工程出错信息、如何修改等问题陈述如下,希望对大家有所帮助。
按照官网的教程一步一步地做完后出现下面的错误:


生成日志      生成 已启动: 项目: COpenCV_ex2,配置: Debug|Win32
 命令行      正在创建临时文件“d:\image C++\C++\COpenCV_ex2\COpenCV_ex2\Debug\RSP00000149925924.rsp”,其内容为
[
/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /Gm /EHsc /RTC1 /MTd /Yu"stdafx.h" /Fp"Debug\COpenCV_ex2.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /c /Wp64 /ZI /TP ".\CvvImage.cpp"

".\COpenCV_ex2View.cpp"

".\COpenCV_ex2Doc.cpp"

".\COpenCV_ex2.cpp"
]
正在创建命令行“cl.exe @"d:\image C++\C++\COpenCV_ex2\COpenCV_ex2\Debug\RSP00000149925924.rsp" /nologo /errorReport:prompt”
 输出窗口      正在编译...
CvvImage.cpp
正在生成代码...
正在编译...
COpenCV_ex2.cpp
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C2146: 语法错误 : 缺少“;”(在标识符“m_image”的前面)
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
COpenCV_ex2Doc.cpp
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C2146: 语法错误 : 缺少“;”(在标识符“m_image”的前面)
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.cpp(90) : error C2065: “m_image”: 未声明的标识符
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.cpp(90) : error C2228: “.Load”的左边必须有类/结构/联合
        类型是“'unknown-type'”
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.cpp(101) : error C2228: “.Save”的左边必须有类/结构/联合
        类型是“'unknown-type'”
COpenCV_ex2View.cpp
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C2146: 语法错误 : 缺少“;”(在标识符“m_image”的前面)
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(18) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2view.cpp(58) : error C2065: “CImage”: 未声明的标识符
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2view.cpp(58) : error C2065: “img”: 未声明的标识符
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2view.cpp(58) : error C2039: “m_image”: 不是“CCOpenCV_ex2Doc”的成员
        d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(10) : 参见“CCOpenCV_ex2Doc”的声明
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2view.cpp(61) : error C2228: “.DrawToHDC”的左边必须有类/结构/联合
        类型是“'unknown-type'”
正在生成代码...
 结果      生成日志保存在“file://d:\image C++\C++\COpenCV_ex2\COpenCV_ex2\Debug\BuildLog.htm”
COpenCV_ex2 - 16 个错误,0 个警告
  

解释:这是因为标准教程用的是较低版本的OpenCV,CImage没有定义,需要添加CvvImage.h和CvvImage.cpp两个文件到工程里:

CvvImage.h

#pragma once
#ifndef CVVIMAGE_CLASS_DEF
#define CVVIMAGE_CLASS_DEF
#include "opencv.hpp"
/* CvvImage class definition */
class  CvvImage
{
public:
	CvvImage();
	virtual ~CvvImage();
	/* Create image (BGR or grayscale) */
	virtual bool  Create( int width, int height, int bits_per_pixel, int image_origin = 0 );
	/* Load image from specified file */
	virtual bool  Load( const char* filename, int desired_color = 1 );
	/* Load rectangle from the file */
	virtual bool  LoadRect( const char* filename,
		int desired_color, CvRect r );
#if defined WIN32 || defined _WIN32
	virtual bool  LoadRect( const char* filename,
		int desired_color, RECT r )
	{
		return LoadRect( filename, desired_color,
			cvRect( r.left, r.top, r.right - r.left, r.bottom - r.top ));
	}
#endif
	/* Save entire image to specified file. */
	virtual bool  Save( const char* filename );
	/* Get copy of input image ROI */
	virtual void  CopyOf( CvvImage& image, int desired_color = -1 );
	virtual void  CopyOf( IplImage* img, int desired_color = -1 );
	IplImage* GetImage() { return m_img; };
	virtual void  Destroy(void);
	/* width and height of ROI */
	int Width() { return !m_img ? 0 : !m_img->roi ? m_img->width : m_img->roi->width; };
	int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : m_img->roi->height;};
	int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : 0; };
	virtual void  Fill( int color );
	/* draw to highgui window */
	virtual void  Show( const char* window );

#if defined WIN32 || defined _WIN32
	/* draw part of image to the specified DC */
	virtual void  Show( HDC dc, int x, int y, int width, int height,
		int from_x = 0, int from_y = 0 );
	/* draw the current image ROI to the specified rectangle of the destination DC */
	virtual void  DrawToHDC( HDC hDCDst, RECT* pDstRect );
#endif
protected:
	IplImage*  m_img;
};
typedef CvvImage CImage;
#endif


CvvImage.cpp

#include "StdAfx.h"
#include "CvvImage.h"
//
// Construction/Destruction
//
CV_INLINE RECT NormalizeRect( RECT r );
CV_INLINE RECT NormalizeRect( RECT r )
{
	int t;
	if( r.left > r.right )
	{
		t = r.left;
		r.left = r.right;
		r.right = t;
	}
	if( r.top > r.bottom )
	{
		t = r.top;
		r.top = r.bottom;
		r.bottom = t;
	}


	return r;
}
CV_INLINE CvRect RectToCvRect( RECT sr );
CV_INLINE CvRect RectToCvRect( RECT sr )
{
	sr = NormalizeRect( sr );
	return cvRect( sr.left, sr.top, sr.right - sr.left, sr.bottom - sr.top );
}
CV_INLINE RECT CvRectToRect( CvRect sr );
CV_INLINE RECT CvRectToRect( CvRect sr )
{
	RECT dr;
	dr.left = sr.x;
	dr.top = sr.y;
	dr.right = sr.x + sr.width;
	dr.bottom = sr.y + sr.height;


	return dr;
}
CV_INLINE IplROI RectToROI( RECT r );
CV_INLINE IplROI RectToROI( RECT r )
{
	IplROI roi;
	r = NormalizeRect( r );
	roi.xOffset = r.left;
	roi.yOffset = r.top;
	roi.width = r.right - r.left;
	roi.height = r.bottom - r.top;
	roi.coi = 0;


	return roi;
}
void  FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
{
	assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));


	BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);


	memset( bmih, 0, sizeof(*bmih));
	bmih->biSize = sizeof(BITMAPINFOHEADER);
	bmih->biWidth = width;
	bmih->biHeight = origin ? abs(height) : -abs(height);
	bmih->biPlanes = 1;
	bmih->biBitCount = (unsigned short)bpp;
	bmih->biCompression = BI_RGB;
	if( bpp == 8 )
	{
		RGBQUAD* palette = bmi->bmiColors;
		int i;
		for( i = 0; i < 256; i++ )
		{
			palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
			palette[i].rgbReserved = 0;
		}
	}
}
CvvImage::CvvImage()
{
	m_img = 0;
}
void CvvImage::Destroy()
{
	cvReleaseImage( &m_img );
}
CvvImage::~CvvImage()
{
	Destroy();
}
bool  CvvImage::Create( int w, int h, int bpp, int origin )
{
	const unsigned max_img_size = 10000;


	if( (bpp != 8 && bpp != 24 && bpp != 32) ||
		(unsigned)w >=  max_img_size || (unsigned)h >= max_img_size ||
		(origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL))
	{
		assert(0); // most probably, it is a programming error
		return false;
	}
	if( !m_img || Bpp() != bpp || m_img->width != w || m_img->height != h )
	{
		if( m_img && m_img->nSize == sizeof(IplImage))
			Destroy();
		/* prepare IPL header */
		m_img = cvCreateImage( cvSize( w, h ), IPL_DEPTH_8U, bpp/8 );
	}
	if( m_img )
		m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL;
	return m_img != 0;
}
void  CvvImage::CopyOf( CvvImage& image, int desired_color )
{
	IplImage* img = image.GetImage();
	if( img )
	{
		CopyOf( img, desired_color );
	}
}
#define HG_IS_IMAGE(img)                                                  \
	((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && \
	((IplImage*)img)->imageData != 0)
void  CvvImage::CopyOf( IplImage* img, int desired_color )
{
	if( HG_IS_IMAGE(img) )
	{
		int color = desired_color;
		CvSize size = cvGetSize( img ); 
		if( color < 0 )
			color = img->nChannels > 1;
		if( Create( size.width, size.height,
			(!color ? 1 : img->nChannels > 1 ? img->nChannels : 3)*8,
			img->origin ))
		{
			cvConvertImage( img, m_img, 0 );
		}
	}
}
bool  CvvImage::Load( const char* filename, int desired_color )
{
	IplImage* img = cvLoadImage( filename, desired_color );
	if( !img )
		return false;


	CopyOf( img, desired_color );
	cvReleaseImage( &img );


	return true;
}
bool  CvvImage::LoadRect( const char* filename,
						 int desired_color, CvRect r )
{
	if( r.width < 0 || r.height < 0 ) return false;


	IplImage* img = cvLoadImage( filename, desired_color );
	if( !img )
		return false;
	if( r.width == 0 || r.height == 0 )
	{
		r.width = img->width;
		r.height = img->height;
		r.x = r.y = 0;
	}
	if( r.x > img->width || r.y > img->height ||
		r.x + r.width < 0 || r.y + r.height < 0 )
	{
		cvReleaseImage( &img );
		return false;
	}
	/* truncate r to source image */
	if( r.x < 0 )
	{
		r.width += r.x;
		r.x = 0;
	}
	if( r.y < 0 )
	{
		r.height += r.y;
		r.y = 0;
	}
	if( r.x + r.width > img->width )
		r.width = img->width - r.x;


	if( r.y + r.height > img->height )
		r.height = img->height - r.y;
	cvSetImageROI( img, r );
	CopyOf( img, desired_color );
	cvReleaseImage( &img );
	return true;
}
bool  CvvImage::Save( const char* filename )
{
	if( !m_img )
		return false;
	cvSaveImage( filename, m_img );
	return true;
}
void  CvvImage::Show( const char* window )
{
	if( m_img )
		cvShowImage( window, m_img );
}
void  CvvImage::Show( HDC dc, int x, int y, int w, int h, int from_x, int from_y )
{
	if( m_img && m_img->depth == IPL_DEPTH_8U )
	{
		uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
		BITMAPINFO* bmi = (BITMAPINFO*)buffer;
		int bmp_w = m_img->width, bmp_h = m_img->height;
		FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );
		from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );
		from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );
		int sw = MAX( MIN( bmp_w - from_x, w ), 0 );
		int sh = MAX( MIN( bmp_h - from_y, h ), 0 );
		SetDIBitsToDevice(
			dc, x, y, sw, sh, from_x, from_y, from_y, sh,
			m_img->imageData + from_y*m_img->widthStep,
			bmi, DIB_RGB_COLORS );
	}
}
void  CvvImage::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 );
	}
}
void  CvvImage::Fill( int color )
{
	cvSet( m_img, cvScalar(color&255,(color>>8)&255,(color>>16)&255,(color>>24)&255) );
}

添加这些代码后,别忘了把.h文件添加至..View.h文件中。再重新编译,发现还是会报错:

输出窗口      正在编译...
COpenCV_ex2Doc.cpp
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.cpp(90) : error C2664: “CvvImage::Load”: 不能将参数 1 从“LPCTSTR”转换为“const char *”
        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.cpp(101) : error C2664: “CvvImage::Save”: 不能将参数 1 从“LPCTSTR”转换为“const char *”
        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
COpenCV_ex2View.cpp
d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2view.cpp(61) : error C2039: “GetSafeHdc”: 不是“CCOpenCV_ex2Doc”的成员
        d:\image c++\c++\copencv_ex2\copencv_ex2\copencv_ex2doc.h(10) : 参见“CCOpenCV_ex2Doc”的声明
正在生成代码...
 结果      生成日志保存在“file://d:\image C++\C++\COpenCV_ex2\COpenCV_ex2\Debug\BuildLog.htm”
COpenCV_ex2 - 3 个错误,0 个警告
 

原因是:前两个错误是因为环境字符集使用了Uincode字符集导致的,把该选项改成“未设置”即可。

第二个错误是因为copencv_ex2view.cpp文件中的void CCOpenCV_ex2View::OnDraw(CDC* /*pDC*/)函数中的pDC被注释起来了,把注释打开并把函数中的一句img.DrawToHDC(pDoc->GetSafeHdc() ,r)中的pDoc换成pDC即可。修改好的代码如下:

void CCOpenCV_ex2View::OnDraw(CDC* pDC)
{
	CCOpenCV_ex2Doc* pDoc = GetDocument();
	//ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CImage & img = pDoc ->m_image;
	CRect r;
	GetClientRect (&r);
	img.DrawToHDC(pDC->GetSafeHdc() ,r);
}

改好之后运行,发现还是有错误:1>LINK : fatal error LNK1104: 无法打开文件“cxcore.lib”

原因是这些库的名字是OpenCV较低版本的库文件,对于OpenCV2.3.1而言,需要换个名字。选择“工程属性->链接器->输入->附加依赖项”,将里面的内容换掉:




即将cxcore.lib cv.lib highgui.lib换成opencv_core231d.lib
opencv_highgui231d.lib
opencv_imgproc231d.lib
opencv_legacy231d.lib
opencv_ml231d.lib
opencv_objdetect231d.lib
opencv_ts231d.lib
opencv_video231d.lib

其中有些项目是不需要的,不过我也不知道哪些该要哪些不该要,索性就全部填进去了。然后点确定就OK了,编译通过。我把修改好的整个解决方案都上传到CSDN了,欢迎大家下载使用。资源名字为“VS2005在MFC中使用OpenCV2.3.1 “
。我相信这个教程不仅可以在VS2005上运行良好,在VS2008、VS2010上一样可以运行得很好!

万事开头难,我相信有了这个好的开头,再做起来就容易多了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在MFC中使用OpenCV2.3.1 的相关文章

随机推荐

  • 随机数选最少数字求和

    本文为最近做过的一道编程笔试题 代码实现方式多种多样 此处本人提供的代码可以获得正确解 仅供大家参考 目录 一 题目描述 二 实现代码程序 三 测试结果截图 一 题目描述 题目描述 小明用计算机随机生成了N个正整数 他希望从这N个数中选取若
  • 【深度学习】从LeNet-5识别手写数字入门深度学习

    活动地址 CSDN21天学习挑战赛 目录 LeNet模型 搭建环境 安装需要的包 创建工程 数据集 相关代码 可以设置GPU训练 默认CPU 通过TensorFlow下载数据集 对数据进行归一化处理 最值归一化 normalization
  • 显卡服务器已停止响应,快速解决W7系统提示显卡驱动程序已停止响应并且已恢复的故障...

    很多w7用户都遭遇过屏幕突然黑一下 小一会儿又恢复的故障 这时候托盘还会气泡提示用户 显示器驱动程序已停止响应 并且已恢复 据笔者验证 Windows Vista以后的电脑系统版本为了增强电脑系统的稳定性 电脑系统中加入了TDR服务 超时检
  • python 白噪声检验-利用python实现平稳时间序列的建模方式

    假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列 就可以利用ARMA模型对该序列进行建模 建模的基本步骤如下 1 求出该观察值序列的样本自相关系数 ACF 和样本偏自相关系数 PACF 的值 2 根据样本自相关系数和偏自相关系数的
  • uniapp项目,HBuilderX真机调试之夜神模拟器

    第一步 夜神模拟器相关配置 1 去官网下载并安装夜神模拟器 2 安装完后 打开模拟器 然后依次找到 设置 gt 关于平板电脑 gt 版本号 连续点击3次 版本号选项 具体根据系统提示操作 然后返回上一页就可以看到开发者选项 开启了开发者模式
  • CentOS禁止Ping方法

    有时候根据需要 如防止攻击 Linux服务器管理员可限制服务器禁止其它用户Ping 同时又保证Linux服务器又可以Ping其它服务器 本文提供两种禁Ping方法 1 通过修改配置文件 这个方法需要ROOT权限 且设置成功后别人无法Ping
  • 密码学之欧拉函数

    最近在学习网易公开课上可汗学院现代密码学的课程 整理了一下自己的笔记 名词 概念 算术基本定理 任何一个数字有且只有一种质因数分解 例如 30 2 3 5 单向函数 正向结合很简单 反向分解很复杂 例如 两个质数相乘容易 将其合数分解很难
  • 块坐标下降法(Block Coodinate Descent)

    问题的描述 给定一个可微的凸函数 如果在某一点x 使得f x 在每一个坐标轴上都是最小值 那么f x 是不是一个全局的最小值 形式化的描述为 是不是对于所有的d i都有 这里的代表第i个标准基向量 答案为成立 这是因为 但是问题来了 如果对
  • mysql备份表的两种方法(数据迁移)

    mysql备份的两种方法 传输方式 单表传输 在数据量小的情况下一般采用insert的方法向备份表中插入数据 当源表的数据量过大时使用表空间的方式进行数据的迁移 第一种方法 针对表中数据量小的情况 1 使用源表的表结构建新的备份表 源表为t
  • 从Eclipse官网查找自己要的插件地址 来安装

    有时候 eclipse自带的应用市场 安装插件老是失败 此时可以试试官网的插件地址 进入eclipse官网 https www eclipse org 选择如图 Marketplace 输入你要查询的插件 点击下载图标 选择你对应的ecli
  • 用户扫描普通二维码进入小程序指定页面详细步骤

    用户扫描普通二维码进入小程序指定页面详细步骤 一 进入微信公众平台小程序开发管理 开发设置 扫普通链接二维码打开小程序 启用 二 添加规则 我这里二维码规则为前台项目地址 可自行修改 下载的校验文件放在了项目里面 根据要求需要放在该服务器域
  • CCleaner如何阻止Internet服务提供商获取您的数据

    要阻止ISP获取您的数据 您需要使用VPN服务 或虚拟隧道提供程序Tor来屏蔽所有浏览行为 要阻止广告客户跟踪广告 您需要在每次浏览完成后清理Cookie CCleaner http www ccleaner cc 会自动执行此操作 CCl
  • c++ primer plus第六版复习题及答案

    第九章 1 对于下面的情况 应该使用哪种存储方案 a homer 是函数的形参 答 homer将自动成为自动变量 b secret 变量由两个文件共享 答 应该在一个文件中将secret变量定义为外部变量 并在第二个文件中使用extern声
  • 如何用python编辑 题目: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    如何用python编辑 题目 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 如何用python编辑 题目 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 题目分析 四个数字组成三位数
  • python模拟报数游戏

    题目 编写程序 模拟报数游戏 有n个人围成一圈 顺序编号 从第一个人开始从1到k 假设k 3 报数 报到k的人退出圈子 然后圈子缩小 从下一个人继续游戏 问最后留下的是原来的第几号 思路 初步实现功能 使用集合输出剩下的数字 而未考虑是第几
  • 性能测试、负载测试、压力测试-之间的差异

    性能测试 负载测试 压力测试 之间的差异 目录 1 什么是性能测试 2 什么是负载测试 3 什么是压力测试 4 性能测试 vs 负载测试 vs 压力测试 5 为什么要进行性能测试 6 为什么要进行负载测试 7 为什么要进行压力测试 8 什么
  • Streamlit 讲解专栏(六):展示文本魔力

    文章目录 1 前言 2 st markdown 引入丰富的Markdown文本 3 st title 引入引人注目的大标题 4 st header 引入简洁的小标题 5 st subheader 添加次级标题 6 st caption 添加
  • zookeeper的安装配置(详细步骤)

    配置前准备 将apache zookeeper 3 7 0 bin tar gz安装包上传到xshell 在xshell上解压缩包 输入解压命令 cd zookeeper tar zxvf apache zookeeper 3 7 0 bi
  • 【大前端】NestedScrollView/ScrollView 加载完自动滑动至底部导致内容上滑问题解决

    正常情况下 由于NestedScrollView ScrollView 嵌套RecyclerView 可能会导致Recyclerview占据焦点导致整个NestedScrollView ScrollView内容上滑 此问题的解决方案如下 1
  • 在MFC中使用OpenCV2.3.1

    最近要做数字图像处理的项目 大家都说VS MFC OpenCV很好用 于是我就试着弄了下 首先我到OpenCV ChinaOpenCV中文版主页找了一些很不错的教程开始做了 我用的是Visual Studio 2005 OpenCV的版本是