我有一个字符串.
char foo[] = "abcdefgh";
Run Code Online (Sandbox Code Playgroud)
我想写一个for循环,并逐个打印出所有字符:
a
b
c
Run Code Online (Sandbox Code Playgroud)
等等
这是在C.
我正在从研究论文中实施一种方法.该方法的一部分需要一个主要的边缘检测器,作者描述如下:
请注意,这不是 Canny边缘检测 - 它们不会对非最大限制抑制等问题感到困扰.我当然可以使用Canny边缘检测来执行此操作,但我希望完全按照本文中的表达方式实现.
最后一步是我有点卡住了.
以下是作者对此的评价:
在从边缘检测过程获得二值边缘图之后,采用二元形态学运算来去除孤立的边缘像素,这可能在边缘检测期间引起误报警.
这就是事情在最后的结果应该是什么样的(边块被填充为黑色):

如果我跳过最后一步,这就是我所拥有的:

它似乎在正确的轨道上.所以,如果我对第4步进行侵蚀,会发生什么:

我已经尝试过侵蚀和扩张的组合来获得与它们相同的结果,但是没有得到任何接近.任何人都可以建议结合使用形态学运算符来获得理想的结果吗?
这是二值化输出,以防有人想玩它:

如果你真的很热衷,这里是源代码(C++):
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <assert.h>
using cv::Mat;
using cv::Size;
#include <stdio.h>
#define DCTSIZE 8
#define EDGE_PX 255
/*
* Display a matrix as an image on the screen.
*/
void
show_mat(char *heading, Mat const &m)
{
Mat clone = m.clone();
Mat scaled(clone.size(), CV_8UC1);
convertScaleAbs(clone, scaled);
IplImage ipl = scaled;
cvNamedWindow(heading, CV_WINDOW_AUTOSIZE);
cvShowImage(heading, &ipl);
cvWaitKey(0);
}
/* …Run Code Online (Sandbox Code Playgroud) 我似乎无法使用OpenCV从文件中捕获帧 - 我已经从Ubuntu上的源代码编译了所有必要的先决条件,根据:http://opencv.willowgarage.com/wiki/InstallGuide%20%3A%20Debian
#!/usr/bin/env python
import cv
import sys
files = sys.argv[1:]
for f in files:
capture = cv.CaptureFromFile(f)
print capture
print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
for i in xrange(10000):
frame = cv.QueryFrame(capture)
if frame:
print frame
Run Code Online (Sandbox Code Playgroud)
输出:
ubuntu@local:~/opencv$ ./test.py bbb.avi
<Capture 0xa37b130>
0.0
0.0
Run Code Online (Sandbox Code Playgroud)
帧总是无......
我使用以下代码将视频文件转码为i420格式:
mencoder $1 -nosound -ovc raw -vf format=i420 -o $2
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试使用Python的内置csv模块写出CSV .
import csv
import sys
writer = csv.writer(sys.stdout, delimiter="|", quoting=csv.QUOTE_NONE)
writer.writerow(['"foo', "bar"])
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
"foo|bar
Run Code Online (Sandbox Code Playgroud)
但是,我明白了:
Error: need to escape, but no escapechar set
Run Code Online (Sandbox Code Playgroud)
该文件说:
当输出数据中出现当前分隔符时,它前面是当前的escapechar字符.如果未设置escapechar,则在遇到需要转义的任何字符时,编写器将引发Error.
现在,分隔符('|',管道字符)不会出现在数据中的任何位置.为什么CSV编写器试图逃避某些事情?
我正在使用以下代码为图像添加一些噪声(直接来自OpenCV参考,第449页 - 解释cv::Mat::begin):
void
simulate_noise(Mat const &in, double stddev, Mat &out)
{
cv::Size s = in.size();
vector<double> noise = generate_noise(s.width*s.height, stddev);
typedef cv::Vec<unsigned char, 3> V4;
cv::MatConstIterator_<V4> in_itr = in.begin<V4>();
cv::MatConstIterator_<V4> in_end = in.end<V4>();
cv::MatIterator_<V4> out_itr = out.begin<V4>();
cv::MatIterator_<V4> out_end = out.end<V4>();
for (; in_itr != in_end && out_itr != out_end; ++in_itr, ++out_itr)
{
int noise_index = my_rand(noise.size());
for (int j = 0; j < 3; ++j)
(*out_itr)[j] = (*in_itr)[j] + noise[noise_index];
}
}
Run Code Online (Sandbox Code Playgroud)
没有什么过于复杂:
in并out …我有一个使用子进程来获取HTML的脚本:
misha@misha-K42Jr:~/git/domain_classifier$ python webkit_retrieve.py error-cut.txt html/error -N 5
http://kurabo.co.jp HostNotFoundError
http://monarch.com HostNotFoundError
http://nssmgmt.com HostNotFoundError
http://sbcglobal.net HostNotFoundError
http://dynamixcorp.com SslHandshakeFailedError
http://groupe-synox.com RemoteHostClosedError
QFont::setPixelSize: Pixel size <= 0 (0)
http://www.cnn.com NoError
http://pacbell.net TimeoutError
Run Code Online (Sandbox Code Playgroud)
如果我运行相同的脚本,但将输出重定向到文件,我在输出中什么也得不到:
misha@misha-K42Jr:~/git/domain_classifier$ python webkit_retrieve.py error-cut.txt html/error -N 5 > stdout.txt
QFont::setPixelSize: Pixel size <= 0 (0)
misha@misha-K42Jr:~/git/domain_classifier$ cat stdout.txt
misha@misha-K42Jr:~/git/domain_classifier$
Run Code Online (Sandbox Code Playgroud)
为什么输出空?它不应该包含在第一种情况下打印到stdout的相同内容吗?
我正在尝试使用PIL的ImageDraw模块进行单独的像素操作.下面的代码应该创建Tkinter canvas小部件.然后打开图像,将一个像素的颜色更改为红色,然后将图像嵌入到画布小部件中.但是,它似乎没有起作用.
我的代码:
import Tkinter
from PIL import ImageTk, Image, ImageDraw
class image_manip(Tkinter.Tk):
def __init__(self):
Tkinter.Tk.__init__(self)
self.configure(bg='red')
self.ImbImage = Tkinter.Canvas(self, highlightthickness=0, bd=0, bg='blue')
self.ImbImage.pack()
im = Image.open(r'C:\Python26\Suite\test.png')
print im.format, im.size, im.mode
im = ImageDraw.Draw(im)
im = im.point((0, 0), fill="red")
self.i = ImageTk.PhotoImage(im)
self.ImbImage.create_image(139, 59, image=self.i)
def run():
image_manip().mainloop()
if __name__ == "__main__":
run()
Run Code Online (Sandbox Code Playgroud)
运行我的代码时出现以下错误:
Exception AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage instance at 0x05DF7698>> ignored
Traceback (most recent call last):
File "<string>", line …Run Code Online (Sandbox Code Playgroud) python image-manipulation tkinter image-processing python-imaging-library
我正在尝试使用 OpenCV 在图像中查找形状。我知道我想要匹配的形状(有些形状我不知道,但我不需要找到它们)和它们的方向。我不知道它们的大小(比例)和位置。
我目前的做法:
这种方法失败的地方是形状接触的地方。轮廓检测将两个相邻的形状拾取为单个轮廓(单个边界框)。匹配步骤显然会失败。
有没有办法修改我分别处理相邻形状的方法?另外,有没有更好的方法来执行第 3 步?
例如:(Es 为绿色,Ys 为蓝色)

失败案例:(红色未知形状)

源代码:
import cv
import sys
E = cv.LoadImage('e.png')
E_ratio = float(E.width)/E.height
Y = cv.LoadImage('y.png')
Y_ratio = float(Y.width)/Y.height
EPSILON = 0.1
im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE)
storage = cv.CreateMemStorage(0)
seq = cv.FindContours(im, storage, cv.CV_RETR_EXTERNAL,
cv.CV_CHAIN_APPROX_SIMPLE)
regions = []
while seq:
pts = [ pt for pt in seq ]
x, y = zip(*pts)
min_x, min_y = min(x), min(y)
width, height = max(x) - min_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) 我正在尝试加载看起来像这样的YAML:
dist: !!opencv-matrix
rows: 380
cols: 380
dt: f
data: [ 0., 0., -1.88644529e+18, 2.45423365e+00, 11698176.,
2.03862047e+00, -8.85501460e+10, 2.54738545e+00, 1.71208843e+20,
...
2.44447327e+00 ]
Run Code Online (Sandbox Code Playgroud)
加载代码只是:
import yaml
y = yaml.load(s)
Run Code Online (Sandbox Code Playgroud)
其中s是加载到字符串中的YAML.
我收到此错误:
yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:opencv-matrix'
in "<string>", line 382, column 7:
dist: !!opencv-matrix
Run Code Online (Sandbox Code Playgroud)
这很公平,所以我添加了该标记的构造函数:
def opencv_matrix(loader, node):
mapping = loader.construct_mapping(node)
mat = np.array(mapping["data"])
mat.resize(mapping["rows"], mapping["cols"])
return mat
yaml.add_constructor(u"!!opencv-matrix", opencv_matrix)
y = yaml.load(s)
Run Code Online (Sandbox Code Playgroud)
我仍然得到错误.但是,如果我用!opencv_matrix替换!! opencv_matrix,那么一切正常.
这里发生了什么?