小编Muf*_*ffo的帖子

变量声明导致分段错误

我不明白程序中出现分段错误的原因.代码可在此处获得

在第29行,我声明了一个PclImage变量,使用typedef定义,类似于struct数组.PclImage类型的定义如下(来自src/libMyKinect.h文件):

typedef struct {
    int valid;
    float x;
    float y;
    float z;
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} Point3d;

typedef Point3d PclImage[480][640];
Run Code Online (Sandbox Code Playgroud)

该程序运行良好,但当我声明一秒钟时PclImage,我一启动程序就会出现分段错误.

例如,如果在第一个文件的第30行,我添加PclImage bgPcl;程序立即崩溃.

谁能帮我?

c typedef segmentation-fault variable-declaration

11
推荐指数
1
解决办法
2943
查看次数

从Canny边缘提取单线轮廓

我想提取图像的轮廓,表示为一系列点坐标.

随着Canny我能够产生包含图像的只有边缘的二值图像.然后,我试图findContours用来提取轮廓.但结果并不好.

对于每个边缘,我经常得到2条线,就像它被认为是一个非常薄的区域.我想简化我的轮廓,以便我可以将它们画成单行.或者可以用不同的函数提取它们,直接产生正确的结果会更好.

我看了一下OpenCV的文档,但我找不到任何有用的东西,但我想我不是第一个遇到类似问题的人.我可以使用任何功能或方法吗?

这是我到目前为止编写的Python代码:

def main():
    img = cv2.imread("lena-mono.png", 0)

    if img is None:
        raise Exception("Error while loading the image")

    canny_img = cv2.Canny(img, 80, 150)

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

    scale = 10
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)

    for cnt in contours:
        color = np.random.randint(0, 255, (3)).tolist()
        cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)

    cv2.imwrite("canny.png", canny_img)
    cv2.imwrite("contours.png", contours_img)
Run Code Online (Sandbox Code Playgroud)

比例因子用于突出轮廓的双线.以下是图片的链接:

  • 莉娜灰度
  • 边缘Canny
  • 轮廓:10倍变焦,您可以在其中看到错误的结果findContours

任何建议将不胜感激.

opencv feature-extraction contour computer-vision edge-detection

9
推荐指数
1
解决办法
1万
查看次数

在由向量索引位置创建一个零填充二维数组与那些

我正在尝试向量化以下MATLAB操作:

给定具有索引的列向量,我想要一个具有相同行数和固定列数的矩阵.矩阵用零初始化,并包含索引指定位置的矩阵.

这是我已经写过的脚本示例:

y = [1; 3; 2; 1; 3];
m = size(y, 1);

% For loop
yvec = zeros(m, 3);
for i=1:m
    yvec(i, y(i)) = 1;
end
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

yvec =

 1     0     0
 0     0     1
 0     1     0
 1     0     0
 0     0     1
Run Code Online (Sandbox Code Playgroud)

没有for循环可以实现相同的结果吗?我试过这样的事情:

% Vectorization (?)
yvec2 = zeros(m, 3);
yvec2(:, y(:)) = 1;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

matlab vectorization octave

8
推荐指数
2
解决办法
816
查看次数

OpenCV findChessboardCorners函数在(显然)简单的场景中失败

我正在尝试使用OpenCV找到棋盘的角落.

我正在使用的图像包含两个棋盘,但我只对其中一个的子区域感兴趣.下图显示了原始图像.

原始图像

然后使用GIMP,我选择了感兴趣的区域,并将所有其他像素设置为默认值.

裁剪图像

我实际上没有裁剪图像,因为我已经使用这个图像尺寸校准了相机,我不想改变它.该操作应该相当于更改图像矩阵中的值,但我更喜欢使用GIMP.这是一次性实验,使用图形工具而不是使用代码执行该操作更快.

生成的图像包含一个24x5角的棋盘,但函数findChessboardCorners无法找到任何内容.

这是我正在使用的Python代码:

>>> img = cv2.imread('C:\\Path\\To\\C4-Cropped.png', 0)
>>> cv2.findChessboardCorners(img, (24, 5))
(False, None)
>>> cv2.findChessboardCorners(img, (5, 24))
(False, None)
Run Code Online (Sandbox Code Playgroud)

我也尝试设置自适应阈值,但它仍然无效

>>> cv2.findChessboardCorners(img, (24, 5), flags=cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH)
(False, None)
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪.我过去多次使用OpenCV的这个功能,它总是有效,即使图像看起来比这个复杂得多.该区域的照明不均匀,但功能应足够强大以处理.

使用GIMP临时创建的人工图像有什么问题吗?我怎样才能找到角落?

任何建议将不胜感激.

python opencv computer-vision camera-calibration

5
推荐指数
4
解决办法
8425
查看次数

调试竞争条件时打印信息的最佳方式

我正在调试一个应用程序来修复我怀疑是由竞争条件引起的分段错误。

我想在代码中添加一些打印语句,但我知道printf不建议添加对的调用,因为这可能会改变线程的行为并在某些情况下隐藏错误。

查看其他选项,我已经看到使用gdb可以使用断点打印某些内容,然后自动继续执行:

break foo
commands
silent
printf "Called foo: x is %d\n",x
cont
end
Run Code Online (Sandbox Code Playgroud)

这比printf在我的代码中放入一个更好吗?

我知道gdb也有一个跟踪点,但它们只适用于 gdbserver,这是我目前更愿意避免的额外复杂程度。

附加信息:该应用程序是用 C 编写的,可在 Linux 上运行。

c debugging printf gdb race-condition

5
推荐指数
1
解决办法
1794
查看次数

从Python启动的子进程比从bash启动的运行慢

我使用以下 Python 代码来运行子进程并将其输出收集为字符串:

def run(command):
    ''' Run a command and return the output as a string '''
    args = shlex.split(command)
    out = subprocess.Popen(args,
            stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]

    # Save to log file
    with open("log_file.txt", "a") as log_file:
        log_file.write("$ " + command + "\n")
        log_file.write(out)

    return out
Run Code Online (Sandbox Code Playgroud)

我的目标是多次运行基准测试应用程序 ( openssl speed) 并使用 Python 解析输出并计算平均结果。

但是,我注意到结果始终比直接从 bash 命令行运行相同命令慢(大约 10%)。

你会如何解释这一点?

编辑

该命令的输出非常短:大约 10 行。另请注意,性能测试运行时基准测试不会打印任何输出。它只打印关键循环之外的结果。

在脚本中,我一次仅运行特定密码的基准测试,因此例如我使用以下参数:

openssl speed -elapsed -engine my_engine rsa2048
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是自定义引擎(基准测试的目标)而不是标准软件实现。我的引擎生成了另一个 pthread,但我不希望产生很大的差异,因为 Python 脚本不应该以任何方式进行交互。

python bash benchmarking

5
推荐指数
0
解决办法
1041
查看次数

为什么Rust编译器在循环中初始化数组时会给出未初始化的变量错误?

编译器抱怨变量未初始化,它是正确的.但是,变量出现在表达式的左侧.

我想我可以通过初始化数组轻松解决这个问题,但我更感兴趣的是理解为什么编译器认为这是一个错误条件.

我认为这不会被标记为其他语言的错误.

这是我的代码:

fn main() {
    const LEN: usize = 5;
    let mut arr: [u32; LEN];

    for i in 0..LEN {
        arr[i] = fib(i as u32);
    }

    println!("{:?}", arr);
}

fn fib(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2),
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

error[E0381]: use of possibly uninitialized variable: `arr`
 --> src/main.rs:6:9
  |
6 |         arr[i] = fib(i as u32);
  |         ^^^^^^^^^^^^^^^^^^^^^^ use …
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
171
查看次数