QT 프로그래밍 이미지 고속 디스플레이 관련 질문드립니다.

erebos_lite의 이미지

안녕하세요, 가입하고 첫 글을 질문글로 쓰게 되었네요.

이제 막 직장에 다니기 시작하였고,
qt 프로그래밍도 직장을 다니면서 배우게 되었습니다.

업무상 프로그래밍을 하다가 미진한 부분이 있어서 이렇게 질문글을 올리게 되었습니다.

현재 카메라2대, 프레임 그래버 2개를 사용하여 grab, snaptshot 동작을 구현하고 있습니다.

ui 의 경우 아주 간단하게만 구성했습니다.
(이미지 표시 라벨, 동작 수행 버튼, 라인 에디터 정도로요.)

그런데 화면에 이미지를 디스플레이를 하는 경우 (또는 하는 순간)
카메라-프레임그래버-PC 로 이어지는 이미지 취득 프레임이 떨어지더군요.

그렇다고 취득하는 이미지 전부 화면에 디스플레이 하지 않습니다.
화면에는 취득하는 이미지 중 일부만 디스플레이 합니다.
(한 초당 1장 내지 10장 정도로요)

예를 들어 현재 어느 한 카메라는 최대 프레임 속도가 253fps 이며
이미지의 크기는 2560*2048, 형식은 bayer gr 8bit 입니다.

이미지를 취득 후 불리는 콜백함수에서
rgb converting(프레임 그래버 API)을 합니다.

그리고 rgb 8bit 로 변환된 이미지를 콜백함수에서
unsigned char* 형태로 post event 를 합니다.
(이때, 이미지 크기는 대략 15M 정도 되겠네요. 5M * 3)

그러면 저는 main ui 에서 대략적으로 아래와 같이 합니다.

================
// main Ui customEvnet 함수

image = QImage(2560, 2048, QImage::format_RGB888);
memcpy(image.bits(), ptrImage, 2560*2048*3);
// ptrImage 는 콜백에서 던져주는 unsigned char* 형태 변수입니다.

onDisplay(); // display 함수 콜
================
//display 함수

pixmap.fromImage(image);
label->setpixmap(pixmap);

================
//필요한 변수들은 왠만해선 초기에 전부 할당해놓고 사용하고 있습니다.

제가 말한 253fps가 떨어진 다는 것은
아래 단락 설명하는 일이 일어나는 것입니다.

프레임 속도가 253 FPS 라는 것은 이미지 1장을 취득하는 것이
1/253 = 3.95ms 걸린 다는 것이고, 이것은 콜백 함수가 3.95ms 마다
한 번씩 불린다는 것입니다. 그러므로 콜백 함수 내에서 처리 시간은
3.95ms 를 넘지 않아야 합니다.

그런데 화면에 디스플레이만 했다 하면 콜백함수 처리 시간이 5ms가 넘게 나오더군요.

아래 링크의 페이지에서 닉네임 " JohannesMunk" 가 제시한 방법을 사용해봤습니다.
그럼에도 불구하고 개선이 되지 않네요.
(QGraphicsScene, QGraphicsView, QGraphicsPixmapItem 를 사용하여 디스플레이 하는 방법)

http://www.qtcentre.org/threads/6929-Any-fast-way(-lt-10ms)-to-display-640

혹시 제가 지금 하고 있는 방법보다 훨씬 더 나은 이미지 디스플레이 방법이 있을까요?

+추가 , (콜백함수 처리 시간 측정방법)
=============================================
// 콜백함수를 사용하는 클래스의 생성자에서 QElapsedTimer 로 생성한 timer.start() 합니다.
// m_currenttime, m_lasttime, m_durationtime, m_msec, m_framerate 모두 초기값은 0
// onNewBufferEvent <- 콜백함수, 그래버보드 제조사에서 제공하는 API 함수입니다.
// onNewBufferEvent 내에서 아래와 같이 합니다.

// 콜백함수 시작하자마자
m_currenttime = timer.nsecelapsed();
m_durationtime = m_currenttime - m_lasttime;
m_lasttime = m_currenttime;
.....
//(이미지 얻어서 rgb 변환 수행)
...
// 콜백함수 마지막에서
m_msec = m_durationtime / 1000000.0;
m_framerate = ((1.0) / m_msec) * 1000.0;

qDebug() << QString("Callback time : %1").arg(m_msec);
qDebug() << QString("FrameRate : %1").arg(m_framerate);
=============================================

+추가2
프레임 그래버 제조사에서 제공해주는 log 프로그램으로 봐도
디스플레이 하기만 하면 rgb 컨버팅을 하는 시간도 같이 늘어나면서
콜백 함수 처리 시간이 늘어나더군요.

물론 본사에 어찌해야하는지 기술지원 요청을 넣어 놨습니다만
큰 기대를 가지고 있지는 않네요.

furmuwon의 이미지

조언을 드리자면..

1. 콜백에서 바로 수행하지 말고 콜백에서 다른 thread 에서 작업 하도록 트리거 함(멀티쓰레딩)
2. 5242880 * 253 fps = 1326448640 bytes 무려 1265Mbytes 나 되는데요
PC 환경인지 임베디드 환경이지 잘 모르겠지만 memory bandwidth 나 bus bandwidth 를 넘어가지 않을려나요?
fps 를 낮춰서 보시는 것은 어떨련지요...(이미 해보셨을지도 모르겠지만)

erebos_lite의 이미지

1. 다른 스레드로 분리해도 마찬가지네요ㅜ

2. pc 환경이지만, 데이터량이 많은게 원인일 수도 있겠네요. memory bandwidth, bus bandwith 를 확인해봐야겠어요. fps 낮추는 건.. 저도 그러고 싶지만 회사에서.. ;; ㅜ

============댓글이랑 서명이랑 헷갈리네=============
프로그램 개발 초보자입니다.

잘 부탁드립니다.

라스코니의 이미지

윗분이 말씀하신대로 별도의 쓰레드나 프로세서에서 처리를 하도록 해야 합니다.
그리고 일초에 253 프레임이나 뿌려대는 카메라라니 대단합니다. 그걸 받아주는 PC 성능도 대단하고요.

하지만 사람은 초당 60 fps 정도면 더 이상 구분을 하지 못하기 때문에 적당히 조절할 필요가 있습니다. 질문하신 분이 말씀하신 대로 초당 1장 또는 10장을 보는 사람이 무리가 없게 화면에 뿌리면 됩니다. 결국은 253 프레임이나 60 프레임이나 똑같습니다. 정말 253 프레임을 뿌릴려면 우선 모니터 성능이 253 프레임/초당을 보여줄 수 있는 모니터인지 확인해 보셔야 하고 (그런 모니터는 없거나 엄청 비싸겠죠), 그래픽 카드도 무척 비싼거야 하겠죠.

결론은 회사를 설득해서 60 프레임 ~ 100 프레임 정도로 타협하시는게 좋습니다.

erebos_lite의 이미지

스레드 분리를 다시 한 번 시도를 해봐야겠네요.

그리고 fps 는 타협이 안되요.

머신비전 용도라 저 속도로 검사진행을 해야되서 ..ㅜ

============댓글이랑 서명이랑 헷갈리네=============
프로그램 개발 초보자입니다.

잘 부탁드립니다.

라스코니의 이미지

머신비전이라니 생소한데 사람 눈으로 보는 용도가 기계로 확인하는 것인가보네요.
Qt + openMP 조합이 딱 좋아 보이는데 한번 확인해 보세요. parallel 처리가 잘 적용되는 케이스인것 같습니다.

erebos_lite의 이미지

openMP 처음 들어보는데 알아봐야겠네요. ㅎㅎ

============댓글이랑 서명이랑 헷갈리네=============
프로그램 개발 초보자입니다.

잘 부탁드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.