C
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);
上一篇: html 标签中 title 的换行
下一篇: 栈的应用笔记