小编big*_*cle的帖子

Win7/8 DWM绘制挂钩

我正在尝试为桌面窗口管理器开发某些扩展.我选择了DLL注入和函数挂钩的方法.它应该在Windows 7和Windows 8中运行.

我成功地将我的DLL注入dwm.exe进程并挂钩了Direct3D设备创建(Win7上的D3D10CreateDevice1和Win8上的D3D11CreateDevice/D3D11Device :: GetImmediateContext).但是,我有挂钩绘图程序(Draw/DrawIndexed/etc.)的问题.

每当我使用指向我的函数的指针替换vtable中的指针时,它们会在一段时间内恢复为原始指针.在DWM/Direct3D中可能有一些挂钩保护??? 我尝试创建后台线程来替换仍然存在的指针.它适用于Win7,但在Win8上很少(似乎指针在那里恢复得更快)

void thread(void* _device)
{
    ID3D10Device1* device = (ID3D10Device1*)_device;
    while(threadRunning)
    {
        if(device->lpVtbl->Draw != My_ID3D10Device1_Draw)
        {
            DX_METHOD_HOOK(device, ID3D10Device1, Draw);
            DX_METHOD_HOOK(device, ID3D10Device1, DrawIndexed);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人有挂钩的经验,他可以给我一些帮助吗?非常感谢你!

hook protection direct3d code-injection dwm

6
推荐指数
0
解决办法
2734
查看次数

OpenCV视差图从左切

我正在尝试使用 OpenCV 3.1 在 C++ 中计算视差图。我使用 StereoSGBM 算法,我需要能够识别远处和非常近的物体。因此,我将 MinDisparity 设置为 -16,将 MaxDisparity 设置为 160。

相机现已正确校准,但生成的视差图是从左侧剪切的。剪切量取决于 MaxDisparity 设置。

我会理解为什么近距离物体会发生这种情况。原因很简单,因为一张图像上的像素在第二张图像上不可用。但对于更远的物体则不会发生这种情况。在这种情况下,该对象在两个相机图像中完全可见,但在生成的视差图中不可见。

看这张图片。为什么结果上看不到我的手? 在此输入图像描述

这个问题有什么解决办法吗?在高 MaxDisparity 设置的情况下计算所有可见区域的视差图?

c++ opencv disparity-mapping

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

OpenCV - 计算与视差图的实际距离

我在 OpenCV 3.1 中使用 StereoSGBM 算法计算了视差图。我已经校准了具有小 RMS 误差的立体相机。现在我想计算视差图中某些点的实际距离(以毫米为单位)。

这似乎是一个比较容易的问题。据我了解,我可以简单地使用公式

distance = (baseline * focal length) / disparity
Run Code Online (Sandbox Code Playgroud)

我可以在这里使用矩阵 Q(从stereoRectify 输出)。Q[2][3] = 焦距,1/Q[3][2] = 基线。

计算出的 Q 矩阵为:

Q: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ 
    1., 0., 0., -1.5668458938598633e+02, 
    0., 1., 0., -1.1948609733581543e+02, 
    0., 0., 0., 2.3598119491957863e+02, 
    0., 0., 1.6254073321947445e-02, 0. ]
Run Code Online (Sandbox Code Playgroud)

问题是结果与现实不符。例如,对于瞄准房间天花板的相机,距离约为 2.5 米(视差正确计算为 12),实际距离计算为 1.3 m。对于非常近的物体(例如 30 厘米),它似乎是正确的,但远物体则非常不正确。在校准过程中,我以毫米为单位指定了棋盘格的确切尺寸。

我完全做到以下几点:

// compute rectification transforms from calibration data
stereoRectify(M1, D1, M2, D2, Size(FRAME_WIDTH, FRAME_HEIGHT), R, T, R1, R2, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv

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

OpenCV stereoRectify扭曲图像

我们有一个ELP 1.0百万像素双镜头Usb立体相机,我们正在尝试使用C++中的OpenCV 3.1进行校准.但是,校准的结果完全无法使用,因为调用stereoRectify会使图像完全变为两次.这就是我们的工作:

在两个相机中找到校准(棋盘)图案,棋盘尺寸为5x7,无论拍摄的图像数量多少,结果几乎相同

findChessboardCorners(img[k], boardSize, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE)
cornerSubPix(img[k], corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01));
Run Code Online (Sandbox Code Playgroud)

正确检测所有使用的棋盘

drawChessboardCorners(img[k], boardSize, corners, bFound);
Run Code Online (Sandbox Code Playgroud)

然后我们分别校准每个摄像机(但这一步似乎对立体声校准不重要),但我们可以用它来分别验证每个摄像机

calibrateCamera(objectPoints, imagePoints[k], Size(320, 240), cameraMatrix[k], distCoeffs[k], rvecs, tvecs, 0)
Run Code Online (Sandbox Code Playgroud)

然后我们做立体声校准

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1],
    Size(320, 240), R, T, E, F, CALIB_USE_INTRINSIC_GUESS);
Run Code Online (Sandbox Code Playgroud)

计算整流变换

stereoRectify(cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], Size(320, 240), R, T, R1, R2, P1, P2, Q,
    CALIB_ZERO_DISPARITY, 1, Size(320, 240), &validRoI[0], &validRoI[1]);
Run Code Online (Sandbox Code Playgroud)

初始化重映射的映射

Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1, Size(FRAME_WIDTH, FRAME_HEIGHT), CV_16SC2, rmap[0][0], …
Run Code Online (Sandbox Code Playgroud)

c++ opencv camera-calibration

3
推荐指数
2
解决办法
6975
查看次数