CCD每拍摄出来一张图片,在其上面画特定的线。

马孔多的黑夜 2014-08-22 02:32:13
如题:
我CCD摄像头每拍摄出来一张图片,我怎么在图片的特定位置上画出线来,画的线是V型的线。。。
...全文
321 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
马孔多的黑夜 2014-08-25
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
仅供参考
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}
大哥,你这代码是实现什么功能的额,有点费解。我的意思是怎么在CCD拍摄到的每帧图片中画线,让保存下来的图片里有我画的线。。。
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
仅供参考
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}
马孔多的黑夜 2014-08-25
  • 打赏
  • 举报
回复

引用 10 楼 zhao4zhong1 的回复:
将画出的内容保存到bmp文件中。


好吧,谢啦
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
将画出的内容保存到bmp文件中。
马孔多的黑夜 2014-08-23
  • 打赏
  • 举报
回复
引用 5 楼 Evankaka 的回复:
这是内存画图。在你保存摄像头采集的图片时,摄像头将数据传到电脑内存,Byte 或char数组。然后它们一般是按你的格式来保存JPEG/BMP等。你要做的是,在他们保存在硬盘之前,调用GDI或GDI+(你用GDI+吧,这个方便些,VS2012已自带了,你只要加载头文件就是)画内存图像画直线,然后将内存图像保存到硬盘上。。。就完了。 你要想法子将采集到的内存数据转到Cimage类的对像中(这个VS2012也是自带的),GDI+能直接在Cimage类的对像中直接画图。
有可参考的代码吗??
马孔多的黑夜 2014-08-23
  • 打赏
  • 举报
回复
引用 5 楼 Evankaka 的回复:
这是内存画图。在你保存摄像头采集的图片时,摄像头将数据传到电脑内存,Byte 或char数组。然后它们一般是按你的格式来保存JPEG/BMP等。你要做的是,在他们保存在硬盘之前,调用GDI或GDI+(你用GDI+吧,这个方便些,VS2012已自带了,你只要加载头文件就是)画内存图像画直线,然后将内存图像保存到硬盘上。。。就完了。 你要想法子将采集到的内存数据转到Cimage类的对像中(这个VS2012也是自带的),GDI+能直接在Cimage类的对像中直接画图。
你的意思我明白了。
Evankaka 2014-08-23
  • 打赏
  • 举报
回复
这是内存画图。在你保存摄像头采集的图片时,摄像头将数据传到电脑内存,Byte 或char数组。然后它们一般是按你的格式来保存JPEG/BMP等。你要做的是,在他们保存在硬盘之前,调用GDI或GDI+(你用GDI+吧,这个方便些,VS2012已自带了,你只要加载头文件就是)画内存图像画直线,然后将内存图像保存到硬盘上。。。就完了。 你要想法子将采集到的内存数据转到Cimage类的对像中(这个VS2012也是自带的),GDI+能直接在Cimage类的对像中直接画图。
马孔多的黑夜 2014-08-23
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    int i,x,y;


    srand(time(NULL));
    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    TextOut(hdc,10,10,"地球人都知道!",14);
    MoveToEx(hdc,5,5,NULL);
    LineTo(hdc,300,  5);
    LineTo(hdc,300, 60);
    LineTo(hdc,  5, 60);
    LineTo(hdc,  5,  5);
    for (i=0;i<100;i++) {
        x=rand()%400;
        y=rand()%300;
        SetPixel(hdc,x,y,0);
    }
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getchar();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
这只是在客户区画线,我的意思是CCD拍摄出来的图片,我把图片保存下来后线是画在图片上的,而不是只存在客户区。
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
仅供参考
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    int i,x,y;


    srand(time(NULL));
    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    TextOut(hdc,10,10,"地球人都知道!",14);
    MoveToEx(hdc,5,5,NULL);
    LineTo(hdc,300,  5);
    LineTo(hdc,300, 60);
    LineTo(hdc,  5, 60);
    LineTo(hdc,  5,  5);
    for (i=0;i<100;i++) {
        x=rand()%400;
        y=rand()%300;
        SetPixel(hdc,x,y,0);
    }
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getchar();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
马孔多的黑夜 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
LineTo
能否说的详细一点,用的是VS2012的。。摄像头的驱动已经有了
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
LineTo
作品最后统一上交。每幅作品要命名,要求对作品进行说明的部分,在实验报告中进行 手写说明。 实验一 熟悉摄影器材(2学时) 时间:2013.3.15 一、实验目的 1、熟悉照相机的基本结构及其种类; 2、了解照相机的附件:三脚架、闪光灯、测光表、滤色镜的性能、作用等。 二、实验前的准备 阅读"照相机的基本结构及种类等"相关的内容,"阅读Nikon F55 \Canon EOS 50D相机使用说明书"。 三、实验具体内容 1、熟悉传统135单反相机主要装置及其作用、掌握其成像原理 2、熟悉数码单反相机主要结构及各部分作用,掌握数码单反相机的成像原理。 3、正确安装、拆卸镜头,闪光灯、滤镜等。 4、练习使用三脚架对拍摄高度、角度的调整。 五、实验步骤 1、熟悉传统135单反相机主要装置及其作用、掌握其成像原理 传统135单反相机主要包括镜头、光圈、快门、取景装置、聚焦机构、输片与计数几 个部分。镜头用来成像,光圈可以控制面的通光量以及面景深大小,快门与光圈共 同控制面曝光量,通过取景器,摄影者对所拍摄的照片的初步构图。调整聚焦机构, 可以保证被摄对象影像清晰等。 传统135单反相机的成像原理为: 照相机工作时,摄影镜头把外界的被摄景物成像在胶片位置上,通过调节通光孔径和 控制快门的启闭,摄影胶片即被曝光而产生适当的潜影,从而完成了一次拍摄动作。已 经曝光的胶片经过化学药液的冲洗,便可以显现出被摄景物的影像。 2、熟悉数码单反相机主要结构及各部分作用,掌握数码单反相机的成像原理 数码单反相机主要结构有镜头、感光器件、模/数转换器(A/D)、数字信号处理器( DSP)、图像存储器、LCD 液晶显示器等。 数码相机的工作过程就是把光信号转化为数字信号的过程。数码相机依靠感光器件成 像,它是数码相机的核心。摄影镜头将光线汇聚到感光器件CCD上,CCD能把光信号转变 成电荷. 模拟信号不能被计算机直接处理,需要从模拟信号到数字信号的转换。模数转换器来执 行这项转换工作,将模拟信号转换成数字信号.然后送入具有信号处理能力的DSP(数字 信号处理器)。数字信号处理器对图像进行压缩、显示,并转化为特定的图像格式,例 如JPEG格式。最后,图像文件被存储在存储器中。通过LCD(液晶显示器)查看拍摄到的 照片,或者输出到计算机、打印机或电视上。 3、三脚架的使用( 看看,写实习报告时,不用写) 三脚架是摄影拍摄中重要的工具,在很多场合它都能起到稳定的作用,从而使你拍摄 出清晰的面。不要以为随便找个地方支好脚架装上相机,就算用脚架了。其实这里面 还有很多细节需要注意。   现在的三脚架一般都是由多节组成,每一节都可以单独抽出,这样可以满足我们不 同高度的拍摄要求。在抽出脚管时,应该先抽出粗管,从粗到细依次打开(如图1)。   在选择排放的位置时也要注意,尽量选择平坦的地方,还要注意四周是否有震动源 ,一辆汽车的经过足以破坏一张优秀的作品。对于一些轻便的脚架,可以考虑在上面挂 一些重物例如摄影包(如图2),这样来保证稳定。不少脚架三个脚管可以分别打开不同 的角度,这在地势不平的地方使用非常方便,可以根据地势的情况选择合适的角度。脚 管的放置方向也是有讲究的,有些朋友经常将脚管对着自己放置,这样不仅妨碍操作, 也很容易碰到脚架。正确的放置方法是一只脚管对着前方(如图3),拍摄者站在另外两 只脚管的中间。   在使用脚架的时候,最好同时使用快门线,这样能防止按快门时产生的震动,特别 是在微距拍摄和长焦拍摄时使用快门线是必要的。在拍摄时,左手紧握着脚架,右手按 快门和相机操作(如图4),这样能尽可能地保证脚架稳定。同时还要注意,身体放松避 免碰撞脚架,按快门时一定要轻。   最后还要注意三脚架的保养维护。在雨天或者海边这样潮湿的环境中使用三脚架后 ,要立刻用干毛巾擦拭干净,特别是关节螺丝处。平时不使用时,也应用三脚架袋装好 ,在干燥的环境中保存。还要定期检查三脚架各关节处是否使用灵活,螺丝是否松动, 按照情况进行必要的维修处理。 注意事项 (1)小心使用照相机,按操作程序来操作,不要用手指摸镜头的镜片。如果镜头脏了,可 用吹气球吹、用镜头扫扫或用镜头纸小心抹去,必要时用镜头清洁剂清洗镜头。不能用 一般的布和纸来擦镜片,以免擦花。 (2)持机平直,可横幅或竖幅构图取景,但不宜歪斜取景。 (3)除了拍日出、日落等把太阳摄入面内可以让阳光直身镜头外,拍摄一般景物应防止 太阳光直射镜头的镜片,否则会使底片产生严重灰雾,必要时应戴上遮光罩。 (4)不要随意空拍,减少快门寿命。 实验二 曝光与测光(2学时) 2013.3.29 一 实验目的 1、掌握曝光和曝光量的含义; 2、知道曝光量与影像质量的关系; 3、熟悉影响曝光量的几种因素; 4、能够根据拍摄需要进行准确

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧