2019-01-26 21:12:42 chuanzhouxiao 阅读数 1017
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    78932 人正在学习 去看看 李宁

一、题目

      

二、思路:

      

     

  (1)如果m=n位置及n=0位置上元素为1:

if(n == 0 || m == n)
    return 1;

(2)其它情况:

        按列计算,当列和行相同时填1;

        当列为0时,也填1;

        其它情况根据递推公式求mat[i][j] = mat[i-1][j-1] + mat[i-1][j];

// 一列一列的计算下去
for(j = 0; j <= n; j++) { // 只要计算n列就行了,不用计算后面的
    mat[j][j] = 1;
    for(i = j+1; i <= m; i++) {
        if(j == 0)
           mat[i][j] = 1;
        else
            mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
    } // 计算Cmn
}

三、实现程序:

//  计算组合数:使用动态规划算法

#include <iostream>

int mat[100][100];

int combinat(int m, int n) {
    int i, j;
    
    if(n == 0 || m == n)
        return 1;
// // 一行一行的计算下去
//    for(i = 1; i <= m; i++) { // m一般不能为0
//        for(j = 0; j <= i && j <= n; j++) { // 当i大于n的时候不用计算,即不用计算n列候的数,节省时间
//            if(j == 0 || j == i)
//                mat[i][j] = 1;
//            else
//                mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
//        }
//    }
    // 一列一列的计算下去
    for(j = 0; j <= n; j++) { // 只要计算n列就行了,不用计算后面的
        mat[j][j] = 1;
        for(i = j+1; i <= m; i++) {
            if(j == 0)
                mat[i][j] = 1;
            else
                mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
        } // 计算Cmn
    }
    return mat[m][n];
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int m, n;
    
    std::cout << "请输入组合数的m和n:";
    std::cin >> m >> n;
    std::cout << combinat(m, n) << std::endl;
    return 0;
}

测试结果:

2010-07-05 09:16:00 DareZhang 阅读数 1788
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    78932 人正在学习 去看看 李宁

1.      首先设置 Visual C++6.0 编译环境的设置

1-1通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for下拉列表中选择Include Files,添加路径:…PROGRAM FILES/MATLAB/R2007A/EXTERN/INCLUDE(在Matlab的安装路径下),再选择下拉列表中的 Library Files,添加路径:…PROGRAM FILES/MATLAB/R2007A/EXTERN/LIB/WIN32/ MICROSOFT/msvc60 (在Matlab的安装路径下)。编译环境只需设置一次.

 C++读取mat数据(1)

来源:(http://blog.sina.com.cn/s/blog_51d7cfc00100braa.html ) - C++读取mat数据(1)_nothingbut38_新浪博客

C++读取mat数据(1)

C++读取mat数据(1)

1-2 添加库文件 : 通过菜单 Projects|settings ,进入 Link 页面,在 Object/Library Modules 框中,添加库文件名: lIBMx.lib libmat.lib libeng.lib 。每个新的工程文件都要单独添加库文件。

C++读取mat数据(1)

C++读取mat数据(1)

2019-07-03 21:43:49 sll_0909 阅读数 74
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    78932 人正在学习 去看看 李宁
#include <iostream>
using namespace std;
int main()
{
	cout << "Hello, world!" << endl;
    return 0;
}
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include "glog/logging.h"
#include "scaccelibrary.h"
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <time.h>
#include <sys/time.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv; 
using namespace std;


int main(int argc, char* argv[]) {
//========================start====================//
	
	int read_num_start = 0;
	int read_num_end;
	Mat img;
	img = imread("/root/Documents/rgb.bmp");

c++ 命名空间

所谓namespace,是指标识符的各种可见范围,bimianmingmingchongtu。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

<iostream>和<iostream.h>不一样

后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用的时候,该头文件没有定义全局命名空间,必须使用namespacestd;这样才能正确使用cout。

<string.h>是旧的C头文件,对应的是基于char*的字符串处理函数;
<string>是包装了std的C++头文件,对应的是新的strng类;
<cstring>是对应旧的C头文件的std版本。

using namespace cv; 的具体意思是:

例如Cvrect和Rect以及cvresize和resize都是表示同一个东西,前者都是指cvrect,后者都是指cvresize,如果在程序开始写上 using namespace cv;则cvrect可以简写为rect,cvresize可以简写为resize,如果没有写上的using namespace cv;那就用cv…所有的以新风格命名的函数都在 cv 命名空间中,如果希望不要每次都输入 cv:: ,则可使用下面语句:using namespace cv;

IplImage和Mat区别

产生不同的原因:IplImage使用的是C结构,而Mat使用的是C++结构

使用IplImage时需要手动管理内存,例如使用cvCreateImage(),cvReleaseImage()等函数创建和释放内存,而且使用不熟练的时候我们会发现IplImage经常出现内存异常,当使用熟练时,程序规模较小时,IplImage这是没有问题的,可是一旦代码变得越来越大他就会越来越来挣扎着处理这一切而不是着眼于实际解决自己的开发目标。

Mat使用的是c++结构,c++中类的概念,在opencv2.0以上,引入例如C++接口,类的使用,使得代码变得更加简洁(c++中类使用. ,c中结构使用->)。

关于使用Mat的第一件事是:不再需要手动分配其内存大小,当不需要使用它的时候也不再需要手动释放它,例如如下程序的区别:

IplImage程序:

IplImage* Image;
IplImage* Image_Gray; // c语言中,声明需要在语句之前
Image = cvLoadImage("D:\\opencv2.4.4\\lema.jpg", 1); // 载入图片,1-彩色
Image_Gray = cvCreateImage(cvGetSize(Image), Image->depth, 1); // 创建内存
cvCvtColor(Image, Image_Gray, CV_BGR2GRAY); // 彩色图->灰度图
cvShowImage("Image", Image);
cvShowImage("Image_Gray", Image_Gray);
cvWaitKey(0);
cvReleaseImage(&Image);
cvReleaseImage(&Image_Gray);

Mat程序:

Mat Image = imread("D:\\opencv2.4.4\\lema.jpg",1);
imshow("Image", Image);
Mat Image_Gray;
cvtColor(Image, Image_Gray, CV_BGR2GRAY, 0);
imshow("Image_Gray", Image_Gray);
waitKey(0);
destroyAllWindows();

imwrite("Gray图像.jpg" Image_Gray);


int img_row = img.rows;
int img_col = img.cols;
int all_pix = img_row*img_col;
int color[20][3]= {{1,208,0},{123,255,0},{149,156,96},{0,135,0},{1,78,0},{160,80,43},{0,213,213},{255,255,255},{216,191,216},{248,0,0},{195,195,195}, {117,149,142},{176,0,0},{78,0,0},{146,73,47},{251,251,0},{230,202,19},{222,0,206},{0,0,227},{179,198,223}};//color,20*3


Mat img_output(img_row, img_col,CV_8UC3,cv::Scalar(0,0,0));
//scalar是将图像设置成单一灰度和颜色,怪不得叫scalar
指定数据类型,用于存储元素和每个矩阵点通道的数量
CV_8UC3: CV_ [每一项的位数] [有符号或无符号] [类型前缀] [通道数]
CV_8UC3 意味着我们使用那些长的 8 位无符号的 char 类型和每个像素都有三个项目的这三个通道的形成

Mat类中的rowRange和colRange 提取某些行或列

Mat area = img_padded.rowRange(Padding, Padding + img.rows).colRange(Padding, Padding + img.cols);
	img.copyTo(area);

example
C++ 图像边界扩充函数copyMakeBorder

  • 函数原型
void copyMakeBorder( const Mat& src, Mat& dst,int top, int bottom, int left, int right,int borderType, const Scalar& value=Scalar() );

src,dst: 原图与目标图像

top,bottom,left,right 分别表示在原图四周扩充边缘的大小

/*
 Various border types, image boundaries are denoted with '|'
 * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
 * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
 * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
 * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
 * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
 */

example

int Padding = 16;
img = imread("/root/Documents/rgb.bmp");
Mat img_padded(img.rows+Padding*2, img.cols+Padding*2,CV_8UC3,Scalar(0,0,0));
copyMakeBorder(img,img_padded,Padding,Padding,Padding,Padding,BORDER_CONSTANT,Scalar(0,0,0));

Mat本质是由两个数据部分组成的类:矩阵头(包含信息有矩阵的大小、用于存储的方法、矩阵存储的地址等),一个指针(指向了像素值的矩阵,可根据选择用于存储的方法采用任何维度存储数据)。矩阵头部的大小是恒定的,然而,矩阵本身的大小因图像的不同而不同,通常是较大的数量级。因而,当你的程序中传递图像并在有些时候需要创建图像副本时,需要花费很大的代价生成图像矩阵本身,而不是图像的头部。

opencv是图像处理库,它包含大量的图像处理函数,因此,图像传给库中的函数是一种常见的做法。为提高大程序的速度,opencv使用引用计数系统,其思想是Mat的每个对象都具有自己的头,让矩阵指针指向同一地址的实例之间共享该矩阵。此外,拷贝运算符将智能复制矩阵头部,也将复制指向矩阵的指针,但不复制矩阵本身。

C++ using namespace std 详解
关于Mat和using namespace cv的使用理解
关于Mat类中的Scalar
OpenCV Mat类详解和用法
OpenCV滤波之copyMakeBorder和borderInterpolate

2016-07-26 16:13:09 u010555688 阅读数 1128
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    78932 人正在学习 去看看 李宁


int imgHorizontalRotary(
	const Mat									srcImg,//输入图片
	Mat											&HoriImg)//输出图片
{
	if(!srcImg.data){
		LOOGE<<"[image error!]";
		return -1; 
	}
	
	int nRet = 0;		
	int j_r, i_c;
	int srcWidth, srcHeight;

	//
	srcWidth = srcImg.cols;
	srcHeight = srcImg.rows;	
	HoriImg = Mat::zeros(srcHeight, srcWidth, CV_8UC3);//输出图片初始化
	
	//翻转原理:生成图片q[i][j] = 原始图片p[i][width - j],其中width为原始图片宽度
	for(j_r = 0; j_r < srcHeight; j_r++){		
		auto ptr = srcImg.ptr<uchar>(j_r);  
		auto qtr = HoriImg.ptr<uchar>(j_r);  
		ptr += srcWidth * 3;
		for(i_c = 0; i_c < srcWidth; i_c++)	{	
			qtr[0] = ptr[0]; 
			qtr[1] = ptr[1]; 
			qtr[2] = ptr[2]; 

			ptr -= 3;
			qtr += 3;
		}
	}
	
	return nRet;
}


2015-05-04 21:23:01 CHALLENG_EVERYTHING 阅读数 1141
  • 征服C++ 11视频精讲

    扫码进入学习群,领取学习资料+讲师答疑 本教程是C++ Primer Plus 6th 、The C++ Programming Language_4th、Thinking in C++等国外顶级的C++著作的精华和个人超过10年的C++使用经验的完美结合。

    78932 人正在学习 去看看 李宁

《NSIDE C++ MODEL》书中第六章关于局部静态对象有这么个例子

const Matrix&

identity(){

  static Matrix mat_identity;

  //....

  return mat_identity;

}

局部静态对象mat_identity的构造和析构都只能执行一次,但是函数可能会被进入多次,C++编译器如何处理这个函数局部静态变量的呢?

方法1:

按照全局变量的做法,把局部静态对象的初始化和析构放到单元文件生成出的sti和std函数中去执行。

这样会有一个缺点,就是该单元文件中所有用到的局部静态对象的初始化和析构都必须拿出来放到那两个函数中,但是有可能拿出来初始化和析构的局部静态对象所申明的函数一次也没有被调用,这不是个好做法。

方法2:

使用临时指针的方法

代码如下:

Matrix mat_identity;

Matrix* pMat;

 identity()

{

    pMax ? 0 : mat_identity.Matrix::Matrix(), pMat = &mat_identity;

    ....;
}

然后在单元文件中增加std函数处理该局部静态变量的析构

如下:

void std()

{

     pMat ? mat_identity.Matrix::~Matrix()  : 0;
}

这样就可以处理函数局部静态变量的构造同时又可以避免构造不需要的函数局部静态变量

C++ RGB图片亮度调整

阅读数 4087

C++ RGB图片垂直翻转

阅读数 1772

没有更多推荐了,返回首页