我正在尝试找到RGB8到RGB32图像转换的汇编优化方法.
Source是8位灰度图像,Destination应该是32位灰度图像(BGRA),第4通道(alpha)可以忽略.源地址不保证16字节对齐,Count是16的倍数,目标地址是16字节对齐.
这是我的优化汇编代码.是否有更快的转换方式?
void ConvertGreyToRgb32Assembler(__m128i* Source, __m128i* Destination, unsigned int Count) {
static unsigned int __declspec(align(64)) Masks[] = {
0x80000000, 0x80010101, 0x80020202, 0x80030303,
0x80040404, 0x80050505, 0x80060606, 0x80070707,
0x80080808, 0x80090909, 0x800a0a0a, 0x800b0b0b,
0x800c0c0c, 0x800d0d0d, 0x800e0e0e, 0x800f0f0f
};
__asm {
mov esi, Source
mov edi, Destination
mov edx, Count
xor ecx, ecx
movdqa xmm4, xmmword ptr [Masks + 0]
movdqa xmm5, xmmword ptr [Masks + 16]
movdqa xmm6, xmmword ptr [Masks + 32]
movdqa xmm7, xmmword ptr [Masks …Run Code Online (Sandbox Code Playgroud) 我正在为我所需的特殊提取和组合操作寻找一种更快的方法,如下所述:
+-------+-------+-------+-------+-------+-------+-------+-------+
| BIT 7 | BIT 6 | BIT 5 | BIT 4 | BIT 3 | BIT 2 | BIT 1 | BIT 0 |
+-------+-------+-------+-------+-------+-------+-------+-------+
| D1 | D0 | C1 | C0 | B1 | B0 | A1 | A0 |
+-------+-------+-------+-------+-------+-------+-------+-------+
A = A0 OR A1
B = B0 OR B1
C = C0 OR C1
D = D0 OR D1
+-------+-------+-------+-------+-------+-------+-------+-------+
| BIT 7 | BIT 6 | BIT 5 | BIT 4 | …Run Code Online (Sandbox Code Playgroud) OpenCV在投影到3D表面的图像上应用校正的最佳方法是什么,如我的示例或在3D表面上的Projection中显示的那样?
我第一次使用OpenCV棋盘角检测测试看起来并不是很有希望.如果摄像机角度太陡,图像太扭曲或太小(太远)没有检测到角落.此外,如果棋盘有太多的字段.
我的想法是使用像3D扫描仪中使用的算法来检测表面(对象),但我不知道OpenCV是否可行.即使OpenCV不可能,用于此类对象扫描的算法是什么?
此图像显示它没有任何校正的样子.

绿色矩形是校正后的投影.

我有一个简单的Qt问题.我希望自动生成的UIC文件派生自自定义接口类,如:
意向
class MyUiInterface {
public:
virtual void setupUi(QWidget* w) = 0;
virtual void retranslateUi(QWidget*w) = 0;
};
Run Code Online (Sandbox Code Playgroud)
生成的UIC文件应如下所示:
class Ui_MyWidget {
public:
void setupUi(QWidget* w) {
...
}
void retranslateUi(QWidget* w) {
...
}
};
namespace Ui {
class MyWidget : public MyUiInterface , public Ui_MyWidget {};
}
Run Code Online (Sandbox Code Playgroud)
为什么?
然后每个Ui :: Class都会实现MyUiInterface.在每个派生自Ui :: Class的类中(请参阅多重继承方法),我将能够调用setupUi,retranslateUi如果从UI :: Class类派生的类也是基类,那么这是有意义的.我希望每个小部件都来自我的abstrcat基类MyWidgetBase.考虑以下:
class MyWidgetBase abstract : public QWidget, protected MyUiInterface {
protected:
void changeEvent(QEvent *e) {
QWidget::changeEvent(e); …Run Code Online (Sandbox Code Playgroud) 不时讨论以下问题。然而,问题本身从来没有解决方案。正如我发现的那样,向前和向后迭代行是有区别的。与向前迭代QSqlQuery::next() 可能导致只有一行,但是落后的迭代QSqlQuery::previous()将永远找不到的所有行。无论是否显式设置前向迭代,都没有影响。
编辑: 参考文献已删除
关于 Qt 文档,正确的方法如下:
QSqlQuery q = db.exec("SELECT * FROM Table");
while (q.next()) {
// Do something with row...
}
Run Code Online (Sandbox Code Playgroud)
但是,这将导致只有一行。向后迭代将找到所有行。
QSqlQuery q = db.exec("SELECT * FROM Table");
if (q.last()) {
do {
// Do something with row...
} while (q.previous());
}
Run Code Online (Sandbox Code Playgroud)
向后迭代可能非常缓慢,应该避免。有谁知道为什么这在前向迭代中不起作用?
编辑:这种行为对我来说并不总是可以重现,有时会发生,有时不会。该数据库包含多个在这种情况下,多行。问题恰好出现在此代码片段中。有没有人有同样的问题?
编辑 2:似乎该错误已在 Qt 4.8.5 中修复。
我当前的环境:Windows 7 (SP1)、Qt 4.8.5。
创建一个具有WS_EX_COMPOSITED样式的窗口:
hWnd = CreateWindowEx(WS_EX_COMPOSITED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
Run Code Online (Sandbox Code Playgroud)
为窗口设置插入符:
case WM_PAINT:
OutputDebugStringA("WM_PAINT");
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_SETFOCUS:
::DestroyCaret();
::CreateCaret(hWnd, NULL, 2, 12);
::SetCaretPos(200, 200);
::ShowCaret(hWnd);
break;
case WM_KILLFOCUS:
::DestroyCaret();
break;
case WM_CHAR:
::DestroyCaret();
::CreateCaret(hWnd, NULL, 2, 12);
::SetCaretPos(200, 200);
::ShowCaret(hWnd);
break;
Run Code Online (Sandbox Code Playgroud)
启动该应用程序,什么也不做。它们将是无限的WM_PAINT,直到隐藏插入记号或破坏插入记号为止。
间谍+ +显示:每0x118(WM_SYSTIMER)插入记号闪烁一次,然后是WM_PAINT消息。
BeginPaint返回的绘画结构是
WM_PAINT : invaliate rect width = 2, height = 12
这只是插入符号的宽度和高度。总之,WM_PAINT用于使插入符号闪烁。
但是,如果我从窗口的其他样式中删除WM_EX_COMPOSITED样式,则不再有无限的WM_PAINT。
这是Windows的错误吗?
PS:测试Windows 7 64bit + …
在C/C++中是否有一种好的快速方法来测试多个变量是包含所有正值还是所有负值?
假设要测试5个变量:
变式1
int test(int a[5]) {
if (a[0] < 0 && a[1] < 0 && a[2] < 0 && a[3] < 0 && a[4] < 0) {
return -1;
} else if (a[0] > 0 && a[1] > 0 && a[2] > 0 && a[3] > 0 && a[4] > 0) {
return 1;
} else {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
变体2
int test(int a[5]) {
unsigned int mask = 0;
mask |= (a[0] >> numeric_limits<int>::digits) << …Run Code Online (Sandbox Code Playgroud) Qt 4.8.1的Microsoft Windows 7实现中出现以下问题:
QLocalServer(命名管道)正在等待客户端连接,它作为以管理权限(例如系统服务)运行的服务器应用程序运行.
如何允许非特权 QLocalSocket客户端连接到该服务器?始终拒绝连接尝试,错误代码为3(QLocalSocket :: SocketAccessError).有解决方案吗?
编辑:我发现,解决方案是通过允许完全访问"Everyone"Sid来改变管道安全性.这里唯一的问题是,SetSecurityInfo一直调用始终失败并显示" 拒绝访问 "错误.首先,我们必须获得一个管柄.由于管道已经由Qt创建,我们将打开它CreateNamedPipe.
HANDLE hPipe = CreateNamedPipe(
(const wchar_t *)_Server->fullServerName().utf16(), // pipe name
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access
PIPE_TYPE_BYTE | // byte type pipe
PIPE_READMODE_BYTE | // byte-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
0, // output buffer size
0, // input buffer size
3000, // client time-out
0 // Default Security
);
// Same call to open/create pipe as in …Run Code Online (Sandbox Code Playgroud) 我想要的是切换轴标签和刻度以最适合显示英寸和毫米而不改变曲线点。我创建了一个自定义 QwtScaleDraw 并覆盖了 label() 方法,但这不会改变刻度。
class QwtMyScaleDraw : public QwtScaleDraw {
public:
QwtMyScaleDraw() : QwtScaleDraw() {
}
protected:
QwtText label(double value) const {
// global conversion routine that creates a display string either as millimeter or inch
return ConvertToString(value, ConversionFromMillimeter);
}
};
Run Code Online (Sandbox Code Playgroud)
您可以在下图中看到此行为:

左边的比例是原始比例,中间的比例是我的自定义标签,右边是所需的比例。
获得所需结果的最佳方法是什么,而无需使用手动转换的值再次添加整个曲线?
qt ×4
c ×3
assembly ×2
optimization ×2
winapi ×2
3d ×1
algorithm ×1
c++ ×1
database ×1
distortion ×1
dspic ×1
generator ×1
interface ×1
named-pipes ×1
opencv ×1
plot ×1
projection ×1
qlocalsocket ×1
qsqlquery ×1
qwt ×1
scale ×1
select ×1
sqlite ×1
sse ×1
uac ×1
visual-c++ ×1
windows ×1
x86 ×1