小编mpe*_*kov的帖子

估计两个图像之间的仿射变换

我有一个示例图像:

在此输入图像描述

我使用以下扭曲矩阵应用仿射变换:

[[ 1.25  0.    -128  ]
 [ 0.    2.    -192  ]]
Run Code Online (Sandbox Code Playgroud)

并从结果中裁剪 128x128 部分以获得输出图像:

在此输入图像描述

现在,我想通过比较样本和输出图像来估计扭曲矩阵和裁剪尺寸/位置。我使用 SURF 检测特征点,并通过强力匹配它们:

在此输入图像描述

有很多匹配项,我保留其中最好的三个(按距离),因为这是估计仿射变换所需的数量。然后,我使用这 3 个关键点来使用 getAffineTransform 来估计仿射变换。然而,它返回的转换是完全错误的:

-0.00 1.87 -6959230028596648489132997794229911552.00 
0.00 -1.76 -0.00
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?源代码如下。

执行仿射变换 (Python):

"""Apply an affine transform to an image."""
import cv
import sys
import numpy as np
if len(sys.argv) != 10:
    print "usage: %s in.png out.png x1 y1 width height sx sy flip" % __file__
    sys.exit(-1)
source = cv.LoadImage(sys.argv[1])
x1, y1, width, height, sx, sy, flip = map(float, sys.argv[3:])
X, …
Run Code Online (Sandbox Code Playgroud)

opencv image image-processing

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

需要帮助矢量化此代码

我有一个8位图像.对于每个像素,我需要计算当前行中的序号位置.例如,如果行是:

32 128 16 64,
Run Code Online (Sandbox Code Playgroud)

那我需要结果:

1 3 0 2,
Run Code Online (Sandbox Code Playgroud)

因为32是该行中的第1个最高值,所以128是第3个最高,16个是第0个最高值,64个是第2个最高值.

我需要对图像的所有行重复上述过程.这是非矢量化代码:

for (int curr = 0; curr < new_height; ++curr)
{
    vector<pair<unsigned char, char> > ordered;
    for (char i = 0; i < 4; ++i)
    {
        unsigned char val = luma24.at<unsigned char>(curr, i);
        ordered.push_back(pair<unsigned char, char>(val, i));
    }
    sort(ordered.begin(), ordered.end(), cmpfun);
    for (int i = 0; i < 4; ++i)
        signature.at<char>(curr, ordered[i].second) = i;
}
Run Code Online (Sandbox Code Playgroud)

luma24是我正在读取的8位图像,它有new_height行和4列. signature是一个相同大小的签名图像(暂时忽略符号的差异,因为它不相关) - 它是我存储结果的地方.cmpfun是一个简单的比较器功能.

我试图对上面的代码进行矢量化并得到了这个:

Mat ordinal;
luma24.convertTo(ordinal, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv vectorization

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

reStructuredText:如何在超链接锚点中包含空格?

我可以做这个:

For more info, see Anchor_.

.. _Anchor: http://google.com
Run Code Online (Sandbox Code Playgroud)

这样可以正确生成将“锚点”链接到“ http://google.com ”的文档。

我想用带有空格的文本替换Anchor:

For more info, see Text With Space_.

.. _Text With Space: http://google.com
Run Code Online (Sandbox Code Playgroud)

上面的示例生成的文档错误地将“空格”链接到未知位置。我希望它将“带空格的文本”链接到“ http://google.com ”。

我该如何实现?

documentation restructuredtext python-sphinx

4
推荐指数
2
解决办法
563
查看次数

这个C++代码试图实现什么?

我正在http://sourceforge.net/projects/dtmf/上学习DTMF代码.我遇到了一些我无法理解的C++代码:

template<int, int, int, int> class Types;
template <> class Types<5, 4, 2, 1>
{
public:
        typedef long int Int40;
        typedef unsigned long int Uint40;
        typedef int Int32;
        typedef unsigned int Uint32;
        typedef short int Int16;
        typedef unsigned short int Uint16;
        typedef char Int8;
        typedef unsigned char Uint8;
};
template <> class Types<8, 4, 2, 1>
{
public:
        typedef long int Int64;
        typedef unsigned long int Uint64;
        typedef int Int32;
        typedef unsigned int Uint32;
        typedef short int Int16; …
Run Code Online (Sandbox Code Playgroud)

c++ templates

3
推荐指数
1
解决办法
316
查看次数

Subprocess.communicate将换行符打印到标准输出

我有一个调用ffprobe的脚本,解析其输出并将其输出到控制台.

这是一个精简版本,没有解析代码和命令行选项:

"""Invoke ffprobe to query a video file and parse the output"""

def ffprobe(fname):
    import subprocess as sub
    import re
    p = sub.Popen(['ffprobe', fname], stderr=sub.PIPE)
    stdout, stderr = p.communicate()

def main():
    ffprobe("foo.mp4")
    #print options.formatstr % locals()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

你可以看到print我的代码中唯一的语句被注释掉了,所以程序不应该输出任何东西.但是,这就是我得到的:

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4

mpenkov@misha-desktop:~/co/youtube$ python ffprobe.py foo.mp4
Run Code Online (Sandbox Code Playgroud)

每次调用都会神秘地输出换行符.它来自哪里,我该如何处理它?

似乎有一个类似的问题,SO,只是它不使用communicate电话(http://stackoverflow.com/questions/7985334/python-subprocess-proc-stderr-read-introduce-extra-lines).

python

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

为什么这个OpenCV代码会出现段错误?

我准备并行化一些我的C++ OpenCV代码.我遇到了一个段错误,我无法理解发生了什么.

这是代码:

class ExhaustiveComparisonMT
{
    vector<Mat> *m_sigs;
    Mat *m_dist;
public:
    ExhaustiveComparisonMT(vector<Mat> sigs, Mat dist)
    {
        m_sigs = &sigs;
        m_dist = &dist; // gdb breakpoint 1 here
    }

    void operator() (size_t last_row, size_t last_col) const
    {
        Mat diff = (*m_sigs)[0].clone(); // segfault happens here, gdb breakpoint 2 here
        for (size_t i = 0; i != last_row; ++i)
        for (size_t j = 0; j != last_row; ++j)
        {
            cv::absdiff((*m_sigs)[i], (*m_sigs)[j], diff);
            m_dist->at<double>(i, j) = cv::sum(diff).val[0];
        }
    }
};

void
exhaustive_comparison(vector<Mat> sigs, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv segmentation-fault

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

使用带循环和标准输出重定向的bash -c

为什么以下命令的标准输出有所不同?

命令1:

for ((i=0; i<10; i=i+1)); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

命令2:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"
Run Code Online (Sandbox Code Playgroud)

command1按预期在单独的行上打印整数1到10.command2在每一行打印10.

我需要做什么才能让command2打印与command1相同的东西?

长篇故事:

我经常需要在大量文件上运行可执行文件并捕获整个过程的输出.我在名为my_script.sh的单独文件中使用类似于command1的for循环.

然后我可以使用以下方式获取输出:

bash my_script.sh > results.txt
Run Code Online (Sandbox Code Playgroud)

因为为简单的for循环创建一个单独的my_script.sh文件有点痛苦,我希望通过使用"bash -c"来实现相同的功能,但遇到了这个问题.

谢谢你的任何建议.期待回复.
米莎

bash

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

需要帮助了解Alpha频道

我有一个像素的RGB元组,我们称之为P.

(255,0,0)是P的颜色,alpha通道为1.0.

当alpha通道为0.8时,P的颜色变为(255,51,51).

如何获得影响P颜色的像素颜色?

transparency alpha alphablending image-processing alpha-transparency

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

Youtube视频统计

有没有办法以编程方式获取YouTube视频的详细信息?

例如,使用此视频:http://www.youtube.com/watch?v = jT7_CtjEVFU

如果我点击"显示视频统计信息"(在视图计数器旁边),我会得到这样的好信息(统计信息按钮带有红色下划线):

在此输入图像描述

起初我以为我可以通过Youtube API实现这一目标,但似乎不可能.

接下来,我考虑手动解析数据.但是,在页面加载时,数据不作为页面源的一部分.它只在我点击统计按钮后出现.

有没有办法在使用某些抓取工具(如wget)时模拟单击按钮?我希望能够wget获得统计数据,然后离线解析.

javascript youtube youtube-api

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

将超过一亿行插入SQLite数据库的最佳方法是什么?

我有一大堆CSV格式的数据.我需要能够基于单个文本字段(主键)索引此数据,因此我正在考虑将其输入数据库.我对之前项目中的sqlite很熟悉,所以我决定使用该引擎.

经过一些实验,我意识到在一个表中存储一亿条记录将无法正常工作:索引步骤很快就会慢慢爬行.我可以想出两个解决这个问题的方法:

  1. 将数据分成几个表
  2. 将数据分成几个数据库

我选择了第二个解决方案(它产生了几个大文件而不是一个大文件).我的分区方法是查看主键的前两个字符:每个分区大约有200万条记录,大约有50个分区.

我在Python中使用sqlite3模块执行此操作.在整个过程中,我保持50个打开的数据库连接并打开游标.对于每一行,我查看主键的前两个字符,通过字典查找获取正确的光标,并执行单个插入语句(通过在光标上调用execute).

不幸的是,插入速度在一段时间后仍然降低到难以忍受的水平(大约1000万个处理过的记录).我该怎么做才能解决这个问题?有没有更好的方法来做我正在做的事情?

python database sqlite

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

SWI Prolog从命令行解释/编译

我正在使用Windows,我想用cmd解释/编译prolog文件,是否有任何方法可以做到这一点?目的是为解释器/编译器prolog创建一个shell到一个文件,如:

gplc -output C:\ a.output -input C:\ a.pl

并在输出文件中作为我的目标的答案.我已经阅读了swi-prolog.com的一些文档,但我没有找到.

我曾尝试使用GNU Prolog(并且它为gcc引发了一个错误)

我有这个文件D:\ a.pl mouther(john).吉吉(OK).

? - jiji(好的).

在CMD中我运行swipl -s D:\ a.pl -o D:\ a2.txt

我想在a2中找到我的目标的答案,但它不是/

compiler-construction shell prolog swi-prolog

0
推荐指数
1
解决办法
4405
查看次数

这是向容器添加元素的正确方法吗?

自从我编写C++以来已经有一段时间了,所以我想确认一下我是否正确地做了这个:

vector<Mat>
VideoHash::dct3d(vector<Mat> cube)
{
    vector<Mat> dctPlanes;
    for (int k = 0; k < TEMPORAL_DIM; ++k)
    {
        Mat spatial;
        Mat freq;
        cube[k].convertTo(spatial, CV_64F);
        dct(spatial, freq);
        dctPlanes.push_back(freq);
    }

    // Do other stuff here
}
Run Code Online (Sandbox Code Playgroud)

我有一个矩阵向量作为函数的输入.对于向量中的每个矩阵,我转换为不同的数据类型(double),对转换结果执行DCT,然后将DCT的结果存储在另一个向量中.

这看起来是对的吗?我对for循环中创建的矩阵有疑问.循环退出后,它们将超出范围.分配给堆栈中那些矩阵的内存会发生什么变化?循环后是否仍然可以访问该内存(例如,在"在此处执行其他操作"部分).

c++ opencv stl

0
推荐指数
1
解决办法
75
查看次数