欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C

程序员文章站 2022-07-14 07:59:42
...

1、初始化操作由 case 标签跳过

错误代码:

switch (CA) {
    case 1: 
        int high_r = 11; //行
        int high_c = 11; //列
        int inter = 5; //亮暗区间隔
        int mul = 3; //亮暗区倍数关系
        shadow_dection(high_r, high_c, mul, inter, deno_img, dec);
        break;

如果要在case里面定义变量,需要用括号括起来{}。

switch (CA) {
	case 1: {
		int high_r = 11; //行
		int high_c = 11; //列
		int inter = 5; //亮暗区间隔
		int mul = 3; //亮暗区倍数关系
		shadow_dection(high_r, high_c, mul, inter, deno_img, dec);
	}
		break;

2、type array[A][B];形式的二维数组,可以通过计算sizeof获取行列数。

sizeof(array[0][0])为一个元素占用的空间,
sizeof(array[0])为一行元素占用的空间,
sizeof(array)为整个数组占用的空间,

行数 = sizeof(array)/sizeof(array[0]);

列数 = sizeof(array[0])/sizeof(array[0][0]);

3、C语言中二维数组如何申请动态分配内存

首先需要注意的是,不要这样一次性分配为数组内存空间:int **arr = (int**)malloc(n * m * sizeof(int));

正确的做法是先分配行,再分配列。释放内存的时候,要先释放列,再释放行。注意,顺序反了的话,会把列的地址擦除,导致释放列时内存时找不到地址,程序崩溃。

正确的分配空间代码如下:

 int **arr = (int **)malloc(n*sizeof(int *));
 for(i=0;i<n;i++)
     arr[i] = (int *)malloc(m*sizeof(int));

正确的释放空间代码如下:

 for (i = 0; i < n; i++)
     free(arr[i]);/*释放列*/
 free(arr);/*释放行*/

#include <stdio.h>
#include <malloc.h>
int main()
{
    int **a;
    int i, j;
    a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行
    for (i = 0; i < 3; ++i){//为每列分配4个大小空间
        a[i] = (int*)malloc(sizeof(int)*4);
    }
    //初始化
    for (i = 0; i < 3; ++i){
        for (j = 0; j < 4; ++j){
            a[i][j] = i+j;
        }
    }
    //输出测试
    for (i = 0; i < 3; ++i){
        for (j = 0; j < 4; ++j){
            printf ("%d ", a[i][j]);
        }
        printf ("\n");
    }
    //释放动态开辟的空间
    for (i = 0; i < 3; ++i){
        free(a[i]);
    }
    free(a);
    return 0;
}
/*
输出:
0 1 2 3
1 2 3 4
2 3 4 5
*/

from:https://blog.csdn.net/Cheatscat/article/details/80307618

from:https://blog.csdn.net/ns_code/article/details/11357667

4、计算积分图像

4.1、图像用以为数组表示

// src 输入图像,灰度图(单通道)
// width 输入图像的宽
// height输入图像的高
// dest 输出的积分图(外部开空间为 (width + 1)* (height + 1) * sizeof(int))
// dest结果的第一行第一列都为0
// 经过验证,结果和opencv的结果一样,可以放心使用。


int integral(unsigned char * src, int width, int height, int * dest)
{
    int destW = width + 1;
    int destH = height + 1;
    memset(dest, 0, destW * destH * sizeof(char));

    int dx = 0;
    int dy = 0;

    for (int i = 0; i < height; i++)
    {
        dy = i + 1;
        for (int j = 0; j < width; j++)
        {
            dx = j + 1;
            dest[dy * destW + dx] = src[i * width + j] + dest[dy * destW + dx - 1] + dest[(dy - 1) * destW + dx] - dest[(dy - 1) * destW + dx -1];
        }
    }


    return 0;
}

4.2、图像用二维数组表示

//计算积分图像
void integralImage(float **image_ext,int row,int col, float **image_ext_integral) {

	for (int i = 1; i < (row + 1); i++)
		for (int j = 1; j < (col + 1); j++)
			image_ext_integral[i][j] = image_ext[i - 1][j - 1] + image_ext_integral[i - 1][j] + image_ext_integral[i][j - 1] - image_ext_integral[i - 1][j - 1];
}



//创建积分图像,初始化为1.(width + 1)* (height + 1)
	float **image_ext_integral = (float**)malloc(sizeof(float*) * (image_ext_row+1));//为二维数组分配行
	for (int i = 0; i < (image_ext_row+1); i++) {//为每列分配4个大小空间
		image_ext_integral[i] = (float*)malloc(sizeof(float) * (image_ext_col+1));
	}
	for (int i = 0; i < (image_ext_row + 1); i++)
		for (int j = 0; j < (image_ext_col+1); j++)
			image_ext_integral[i][j] = 0;

	integralImage(image_ext, image_ext_row, image_ext_col, image_ext_integral);