图像灰度化用啥函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像灰度化用啥函数相关的知识,希望对你有一定的参考价值。
参考技术A 没有现成的函数吧,好像。我给你一个24bit灰度化程序,编程环境VC//Bitmap.h
#include<malloc.h>
#include<string.h>
#include<stdio.h>
#ifdef _BITMAP_
#undef _BITMAP_
#endif
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef BYTE* LPBYTE;
typedef unsigned int UINT;
typedef unsigned long LONG;
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
BITMAPFILEHEADER,*LPBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPalanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
BITMAPINFOHEADER,*LPBITMAPINFOHEADER;
typedef struct tagRGBQUAD
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
RGBQUAD,*LPRGBQUAD;
//Put data into the struct
typedef struct tagBMPINFOMATION
LPBITMAPFILEHEADER lpBmpFileHeader;
LPBITMAPINFOHEADER lpBmpInfoHeader;
LPRGBQUAD lpRgbQuad;
LPBYTE lpBmpData;
LONG nBmpWidth;
LONG nBmpHeight;
BMPINFOMATION;
#pragma pack()
typedef unsigned int UINT;
typedef unsigned int BOOL;
#define TRUE 1;
#define FALSE 0;
//Bitmap.cpp
#include"Bitmap.h"
#include<stdlib.h>
typedef struct tagDibFile
LPBITMAPFILEHEADER m_lpFileHeader;
LPBITMAPINFOHEADER m_lpInfoHeader;
LPRGBQUAD m_lpRgbQuad;
LPBYTE m_lpBmpData;
DibFile,*LPDibFile;
typedef char* LPSTR;
UINT NumOfDibColor(DibFile dibFile)
UINT nColors=0;
switch(dibFile.m_lpInfoHeader->biBitCount)
case 1:nColors=2;break;
case 4:nColors=16;break;
case 8:nColors=256;break;
default:nColors=0;
return nColors;
BOOL LoadDibFile(DibFile& dibFile,LPSTR m_lpFileName)
FILE* fp=fopen(m_lpFileName,"rb");
if(!fp) return FALSE;
UINT nCount,size;
//Read File Header
size=sizeof(BITMAPFILEHEADER);
dibFile.m_lpFileHeader=(LPBITMAPFILEHEADER)malloc(size);
nCount=fread(dibFile.m_lpFileHeader,1,size,fp);
if(nCount!=size) return FALSE;
//Read Info Header
size=sizeof(BITMAPINFOHEADER);
dibFile.m_lpInfoHeader=(LPBITMAPINFOHEADER)malloc(size);
nCount=fread(dibFile.m_lpInfoHeader,1,size,fp);
if(nCount!=size) return FALSE;
//Read RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
if(size==0) dibFile.m_lpRgbQuad=NULL;
else
dibFile.m_lpRgbQuad=(LPRGBQUAD)malloc(size);
nCount=fread(dibFile.m_lpRgbQuad,1,size,fp);
if(nCount!=size) return FALSE;
//Read File Data
fseek(fp,dibFile.m_lpFileHeader->bfOffBits,SEEK_SET);
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
dibFile.m_lpBmpData=(LPBYTE)malloc(size);
nCount=fread(dibFile.m_lpBmpData,1,size,fp);
if(nCount!=size) return FALSE;
fclose(fp);
return TRUE;
BOOL BlackenDib256(DibFile& dibFile)
UINT size;
if(dibFile.m_lpInfoHeader->biBitCount<=8) return TRUE;
//Info Header
dibFile.m_lpInfoHeader->biBitCount=8;
dibFile.m_lpInfoHeader->biClrUsed=0;
//RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
dibFile.m_lpRgbQuad=(LPRGBQUAD)malloc(size);
LPRGBQUAD RgbQuad=(LPRGBQUAD)malloc(sizeof(RGBQUAD));
for(UINT i=0;i<256;i++)
RgbQuad->rgbBlue=i;
RgbQuad->rgbGreen=i;
RgbQuad->rgbRed=i;
RgbQuad->rgbReserved=0;
memcpy(dibFile.m_lpRgbQuad+i,RgbQuad,sizeof(RGBQUAD));
//File Header
dibFile.m_lpFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+size;
//File Data
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
LPBYTE lpData=(LPBYTE)malloc(size);
int r,g,b;
for(i=0;i<size;i++)
b=dibFile.m_lpBmpData[3*i];
g=dibFile.m_lpBmpData[3*i+1];
r=dibFile.m_lpBmpData[3*i+2];
memset(lpData+i*sizeof(BYTE),(BYTE)(0.4*b+0.3*g+0.3*r),sizeof(BYTE));
dibFile.m_lpBmpData=(LPBYTE)realloc(dibFile.m_lpBmpData,size);
memcpy(dibFile.m_lpBmpData,lpData,size);
return TRUE;
BOOL SaveDibFile(DibFile dibFile,LPSTR m_lpFileName)
FILE* fp=fopen(m_lpFileName,"wb");
if(!fp) return FALSE;
UINT nCount,size;
//Write File Header
size=sizeof(BITMAPFILEHEADER);
nCount=fwrite(dibFile.m_lpFileHeader,1,size,fp);
if(nCount!=size) return FALSE;
//Write Info Header
size=sizeof(BITMAPINFOHEADER);
nCount=fwrite(dibFile.m_lpInfoHeader,1,size,fp);
if(nCount!=size) return FALSE;
//Write RgbQuad
size=NumOfDibColor(dibFile)*sizeof(RGBQUAD);
if(dibFile.m_lpRgbQuad!=NULL)
nCount=fwrite(dibFile.m_lpRgbQuad,1,size,fp);
if(nCount!=size) return FALSE;
//Write File Data
fseek(fp,dibFile.m_lpFileHeader->bfOffBits,SEEK_SET);
UINT lineOfBits=(dibFile.m_lpInfoHeader->biWidth*dibFile.m_lpInfoHeader->biBitCount)/8;
size=lineOfBits*dibFile.m_lpInfoHeader->biHeight;
nCount=fwrite(dibFile.m_lpBmpData,1,size,fp);
if(nCount!=size) return FALSE;
fclose(fp);
return TRUE;
int main()
DibFile dibFile;
LPSTR m_lpFileName="D:\\GraphTest\\in.bmp";
if(!LoadDibFile(dibFile,m_lpFileName)) return 0;
printf("bfType=%x\n",dibFile.m_lpFileHeader->bfType);
BlackenDib256(dibFile);
SaveDibFile(dibFile,"d:\\graphtest\\out.bmp");
return 1;
使用控制台程序,如果在tutbo c下,需要将#pragma指令去掉,你可以试试
使用 OpenCV 函数的灰度图像的 Videowriter 函数
【中文标题】使用 OpenCV 函数的灰度图像的 Videowriter 函数【英文标题】:Videowriter function for greyscale image using OpenCV function 【发布时间】:2016-12-21 20:54:57 【问题描述】:我有一台 GigaE 相机,它可以为我提供灰度图像,我想将其录制为视频并稍后处理。
所以作为第一步,我尝试使用我的网络摄像头录制视频,它可以工作,如果我在将其写入视频之前将其转换为灰度。我没有收到任何视频。 我的代码如下
int main(int argc, char* argv[])
VideoCapture cap(0);
VideoWriter writer;
if (!cap.isOpened())
cout << "not opened" << endl;
return -1;
char* windowName = "Webcam Feed";
namedWindow(windowName, CV_WINDOW_AUTOSIZE);
string filename = "D:\myVideo_greyscale.avi";
int fcc = CV_FOURCC('8', 'B', 'P', 'S');
int fps = 30;
Size frameSize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
writer = VideoWriter(filename,-1,fps,frameSize);
if(!writer.isOpened())
cout<<"Error not opened"<<endl;
getchar();
return -1;
while (1)
Mat frame;
bool bSuccess = cap.read(frame);
if (!bSuccess)
cout << "ERROR READING FRAME FROM CAMERA FEED" << endl;
break;
cvtColor(frame, frame, CV_BGR2GRAY);
writer.write(frame);
imshow(windowName, frame);
return 0;
`
我用fcc
和-1
尝试了所有的可能性,他们都无法录制视频。
我还尝试了creating a grayscale video using opencv fcc
有 CV_FOURCC('8','B','P','S')
但它没有帮助我。
使用断点后调试时出现此错误
【问题讨论】:
【参考方案1】:VideoWriter 有一个可选参数,它告诉视频是灰度还是彩色。默认 ist 颜色 = true。试试
bool isColor = false;
writer = VideoWriter(filename,-1,fps,frameSize, isColor);
【讨论】:
嘿 Micka,我试过了,还是不行。我使用框架 fcc 有 CV_FOURCC('D','I','V','3');或者您知道用于灰度图像的任何其他特定编解码器 不知道,抱歉。转换为“颜色”是否适合您? cv::cvtColor (src, dst, CV_GRAY2BGR)。 嘿,它可以工作.. 但我的 GigaE Pro 相机无法使用 嘿,它适用于 OpenCV 2.4.11 但它不适用于 OpenCV 3.0.0,甚至文件也没有写入。 不知道抱歉...您的程序是否可以访问正确的 openCV 版本的 opencv_ffmpeg* dll 文件?以上是关于图像灰度化用啥函数的主要内容,如果未能解决你的问题,请参考以下文章
Python图像处理丨基于OpenCV和像素处理的图像灰度化处理