我有一个示例图像:

我使用以下扭曲矩阵应用仿射变换:
[[ 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) 我有一个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) 我可以做这个:
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 ”。
我该如何实现?
我正在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) 我有一个调用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).
我准备并行化一些我的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) 为什么以下命令的标准输出有所不同?
命令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"来实现相同的功能,但遇到了这个问题.
谢谢你的任何建议.期待回复.
米莎
我有一个像素的RGB元组,我们称之为P.
(255,0,0)是P的颜色,alpha通道为1.0.
当alpha通道为0.8时,P的颜色变为(255,51,51).
如何获得影响P颜色的像素颜色?
transparency alpha alphablending image-processing alpha-transparency
有没有办法以编程方式获取YouTube视频的详细信息?
例如,使用此视频:http://www.youtube.com/watch?v = jT7_CtjEVFU
如果我点击"显示视频统计信息"(在视图计数器旁边),我会得到这样的好信息(统计信息按钮带有红色下划线):

起初我以为我可以通过Youtube API实现这一目标,但似乎不可能.
接下来,我考虑手动解析数据.但是,在页面加载时,数据不作为页面源的一部分.它只在我点击统计按钮后出现.
有没有办法在使用某些抓取工具(如wget)时模拟单击按钮?我希望能够wget获得统计数据,然后离线解析.
我有一大堆CSV格式的数据.我需要能够基于单个文本字段(主键)索引此数据,因此我正在考虑将其输入数据库.我对之前项目中的sqlite很熟悉,所以我决定使用该引擎.
经过一些实验,我意识到在一个表中存储一亿条记录将无法正常工作:索引步骤很快就会慢慢爬行.我可以想出两个解决这个问题的方法:
我选择了第二个解决方案(它产生了几个大文件而不是一个大文件).我的分区方法是查看主键的前两个字符:每个分区大约有200万条记录,大约有50个分区.
我在Python中使用sqlite3模块执行此操作.在整个过程中,我保持50个打开的数据库连接并打开游标.对于每一行,我查看主键的前两个字符,通过字典查找获取正确的光标,并执行单个插入语句(通过在光标上调用execute).
不幸的是,插入速度在一段时间后仍然降低到难以忍受的水平(大约1000万个处理过的记录).我该怎么做才能解决这个问题?有没有更好的方法来做我正在做的事情?
我正在使用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中找到我的目标的答案,但它不是/
自从我编写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++ ×4
opencv ×4
python ×2
alpha ×1
bash ×1
database ×1
image ×1
javascript ×1
prolog ×1
shell ×1
sqlite ×1
stl ×1
swi-prolog ×1
templates ×1
transparency ×1
youtube ×1
youtube-api ×1