현재 위치 - 중국 분류 정보 발표 플랫폼 - 여행정보 - 영상의 밝기와 대비를 조정하여 화질을 개선하세요.

영상의 밝기와 대비를 조정하여 화질을 개선하세요.

참고:

/boonya/article/details/79753091

/u 010029439/article/details/84754395

두 분께 미리 감사드립니다!

비디오 필터링 예제인 ffmpeg 소스 코드 doc\examples\filtering_video.c에서 밝기 및 대비를 조정하여 이미지 품질을 향상시키는 ffmpeg?\libavfilter\vf_eq.c를 참조할 수 있습니다.

명령줄 참조:

ffmpeg.exe-I test.mp4-VF eq = contrast=1:밝기= 0.1 out.mp4

밝기, 대비, 채도 및 대략적인 감마 조정을 설정합니다.

이 필터는 다음 옵션을 지원합니다.

Contrast

대비 표현식을 설정하며, 값은 -2.0에서 2.0 사이의 부동 소수점 수여야 하며 기본값은 0입니다.

Clever

밝기 표현식을 설정합니다. 값은 -1.0에서 1.0 사이의 부동 소수점 숫자이어야 하며 기본값은 0입니다.

Soak

채도 표현식을 설정합니다. 값은 0에서 3.0 사이의 부동 소수점 숫자이며 기본값은 1이어야 합니다.

------- ---------

공개 보안 클래스 VideoFiltering{

#Region 클래스 멤버 변수

AVFilterGraph * m _ filter _ graph = null;

AVFilterContext * m _ buffer sink _ CTX = null;

AVFilterContext * m _ buffersrc _ CTX = null;

AVFrame * m _ filter _ frame = null

Object m _ lock _ record = new Object(); ?

#endregion?

public int Init(int width, int height, int contrast, int brightness) {

Lock (m _ lock _ record) {

//Key snippet?

if (m_filter_graph!= null)?

return-1; ?

대비 = 대비 & lt1 ?1:대비;

대비 = 대비 & GT9 ?9:대비;

밝기 = 휘도 & lt1 ?1:밝기;

밝기 = 휘도 & GT9 ?9:휘도;

플로트 대비 _ f = 1+ (((( float)(contrast-5))/10;

float 밝기 _ f = 0+((float)(밝기-5))/10;

string_filter_description = string. format(" eq = contrast = " +contrast _ f . ToString()+":밝기 = "+밝기 _ f . ToString());

return init_filters(width, height, filters _ descr);

}

}

Public int Reset(int width, int height, int contrast, int 밝기) {

deinit(); ?

Return Init(width, height, contrast, brightness); ?

}

공개 int Filter(av frame * frame _ src, AVFrame **frame_dst)? {?

lock(m_lock_record){

*frame_dst = frame _ src?

if (m_filter_graph == null) {

return-1; ?

}

int ret?

//AV_BUFFERSRC_FLAG_KEEP_REF = 8, ?

ret = ffmpeg . AV_BUFFERSRC_ADD_FRAME_FLAGS(M_BUFFERSRC_CTX, FRAME_SRC, 8);

if(ret & lt;0)?

반환 ret?

ret = ffmpeg . av _ buffer sink _ get _ frame(m _ buffer sink _ CTX, m _ filter _ frame);?

if(ret & lt; 0)

Return ret?

* frame _ dst = m _ filter _ frame; ?

Return 0; ?

}?

}

public void UnrefFrame() {

lock(m_lock_record) {

if (m_filter_graph == null)?

Return; ?

ffmpeg . AV _ FRAME _ UNREF(M _ FILT _ FRAME); ?

}?

}?

공개 void Deinit()? {?

if (m_filter_graph == null)?

Returns; ?

if (m_filter_graph! == null)? {?

fix(AVFilterGraph * * filter _ graph = & amp; m_filter_graph)?

ffmpeg . AV FILTER _ GRAPH _ FREE(FILTER _ GRAPH); ?

}?

if (m_filt_frame! = null)? {?

Fix (AVFrame * * filter _ frame = & ampm_filt_frame)?

ffmpeg . AV _ FRAME _ FREE(FILT _ FRAME);?

}?

}?

비공개 int init _ filters(int width, int height, string filters_descr) {

int ret = 0;?

ffmpeg . AV FILTER _ REGISTER _ ALL(); ?

//AVPixelFormat. av _ PIX _ FMT _ YUV 420 p = 0;?

StringParameter = string. format("video_size = " + width. ToString() + "x" + height. ToString() + ":pix _ fmt = 0:time _ base = 1/20");?

AV 필터 * 버퍼 src = ffmpeg . AV FILTER _ GET _ BY _ NAME(" BURPER "); ?

AV 필터 * 버퍼 싱크 = ffmpeg . av filter _ get _ by _ name(" buffer sink "); ?

AVFilterInOut * outputs = ffmpeg . AV FILTER _ INOUT _ ALLOC(); ?

AVFilterInOut * inputs = ffmpeg . AV FILTER _ INOUT _ ALLOC(); ?

//av rational time _ base; ?

int * pix _ fmts = (int *)ffmpeg . AV _ MALLOC(8);?

pix _ fmts[0] = (int)AVPixelFormat. av _ PIX _ FMT _ YUV 420 p; ?

pix _ fmts[1] = (int)AVPixelFormat. av _ PIX _ FMT _ none; ?

//AVPixelFormat pix _ fmts[]= { AVPixelFormat. av _ pix _ fmt _ yuv420p, AVPixelFormat. av _ pix _ fmt _ none}; ?

m _ filter _ graph = ffmpeg . AV filter _ graph _ alloc(); ?

if(outputs = = null | | | inputs = = null | | m _ filter _ graph = = null)? {?

ret = -1; ?

끝으로 이동; ?

}?

fixed(AVFilterContext * * buffersrc _ CTX = & amp; m_buffersrc_ctx) {?

ret = ffmpeg . av filter _ graph _ create _ filter(buffersrc _ CTX, buffer src, " in ", args, null, m _ filter _ graph); ?

if(ret & lt; 0)? {?

끝으로 이동; ?

}?

}?

fixed(AVFilterContext * * 버퍼 싱크 _ CTX = & amp; m_buffersink_ctx) {?

ret = ffmpeg . av filter _ graph _ create _ filter(buffersink _ CTX, buffer sink, " out ", null, null, m _ filter _ graph); ?

if(ret & lt; 0){?

끝으로 이동; ?

}?

}

int size =(int)ffmpeg . av _ int _ list _ length _ for _ size(1, (void*)pix_fmts, unchecked ((ulong)AVPixelFormat. av _ PIX _ FMT _ none));?

ret = ffmpeg . AV _ OPT _ set _ bin(m _ 버퍼 싱크 _ CTX, " pix_fmts ", (byte*)pix_fmts, size, ffmpeg. AV _ OPT _ SEARCH _ CHILDREN); ?

if(ret & lt; 0)?

끝으로 이동; ?

출력 ->; name = ffmpeg . AV _ STRDUP(" IN ");?

Output->; filter _ ctx = m _ buffersrc _ ctx?

Output->; pad _ idx = 0; ?

Output->; next = null?

Input->; name = ffmpeg . AV _ STRDUP(" OUT "); ?

Input->; filter _ ctx = m _ buffersink _ ctx?

Input->; pad _ idx = 0; ?

Input->; next = null?

ret = ffmpeg . AV FILTER _ GRAPH _ PARSE _ PTR(M _ FILTER _ GRAPH, FILTS_DESCR, & AMP 입력 및 출력. Output, null); ?

if(ret & lt; 0)?

끝으로 이동; ?

ret = ffmpeg . AV FILTER _ GRAPH _ CONFIG(M _ FILTER _ GRAPH, NULL);?

if(ret & lt; 0)?

끝으로 이동; ?

m _ filter _ frame = ffmpeg . AV _ FRAME _ ALLOC();?

end:?

ffmpeg . AV FILTER _ INOUT _ FREE(& AMP; INPUT); ?

ffmpeg . AV FILTER _ INOUT _ FREE(& AMP; OUTPUT); ?

ffmpeg . AV _ FREE(PIX _ FMTS); ?

if(ret & lt; 0)

deinit();

returns ret

}

p>확인된 효과는 분명하며 필요에 따라 파라미터를 변경해 볼 수 있습니다.