1-92 Terjemahan - En.id-Dikonversi PDF
1-92 Terjemahan - En.id-Dikonversi PDF
info
Menguasai OpenCV
dengan Proyek Visi
Komputer Praktis
BIRMINGHAM - MUMBAI
www.it-ebooks.info
Menguasai OpenCV dengan
Proyek Visi Komputer Praktis
Copyright © 2012 Packt Publishing
Seluruh hak cipta. Tidak ada bagian dari buku ini dapat direproduksi, disimpan
dalam sistem pencarian, atau ditransmisikan dalam bentuk apapun atau dengan
cara apapun, tanpa izin tertulis dari penerbit, kecuali dalam kasus kutipan
singkat tertanam dalam artikel kritis atau ulasan.
Setiap upaya telah dilakukan dalam penyusunan buku ini untuk memastikan
keakuratan informasi yang disajikan. Namun, informasi yang terkandung dalam
buku ini dijual tanpa jaminan, baik tersurat maupun tersirat. Baik penulis, atau
Packt Publishing, dan dealer dan distributor akan dapat dimintai tanggung
jawab untuk kerugian yang disebabkan atau diduga disebabkan langsung atau
tidak langsung oleh buku ini.
Packt Publishing telah berupaya untuk memberikan informasi merek dagang tentang
semua perusahaan dan produk yang disebutkan dalam buku ini dengan penggunaan
yang tepat dari ibukota. Namun, Packt Publishing tidak dapat menjamin keakuratan
informasi ini.
ISBN 978-1-84951-782-9
www.packtpub.com
Graphics
Memimpin Teknis Editor
Valentina D'silva
Ankita Shashi
Aditi Gajjar
Editor teknis
Sharvari Baet Koordinator Produksi
Arvindkumar Gupta
Prashant Salvi
penutup Kerja
Arvindkumar Gupta
www.it-ebooks.info
Tentang Penulis
Daniel Lelis Baggio mulai karyanya dalam visi komputer melalui medis
pengolahan citra di INCOR (Instituto melakukan Coração - Heart Institute) di São Paulo,
di mana ia bekerja dengan segmentasi USG gambar intra-vaskular. Dari dulu,
ia telah difokuskan pada GPGPU dan porting algoritma segmentasi untuk bekerja dengan
CUDA NVIDIA. Ia juga terjun ke enam derajat pelacakan kepala kebebasan
dengan kelompok user interface alami melalui EHCI proyek yang disebut
(http://code.google.com/p/ EHCI /). Dia sekarang bekerja untuk Angkatan Udara Brasil.
Shervin Emami (Lahir di Iran) belajar sendiri elektronik dan robotika hobi
selama awal remaja di Australia. Sambil membangun robot pertama pada usia
15, ia belajar bagaimana RAM dan CPU bekerja. Dia begitu kagum dengan
konsep yang ia segera merancang dan membangun sebuah motherboard Z80
secara keseluruhan untuk mengontrol robot, dan menulis semua software murni
dalam kode mesin biner menggunakan dua tombol push untuk 0s dan 1s. Setelah
mengetahui bahwa komputer dapat diprogram dengan cara lebih mudah seperti
bahasa assembly dan bahkan kompiler tingkat tinggi, Shervin menjadi
kecanduan untuk pemrograman komputer dan telah pemrograman desktop,
robot, dan smartphone hampir setiap hari sejak itu. Selama akhir remaja ia
menciptakan Draw3D (http://draw3d.shervinemami.info/), Pembuat model
3D dengan 30.000 baris dioptimalkan C dan kode assembly yang diberikan grafis
3D lebih cepat dari semua alternatif komersial waktu; tapi ia kehilangan minat
dalam pemrograman grafis ketika akselerasi perangkat keras 3D menjadi
tersedia.
www.it-ebooks.info
Di Universitas, Shervin mengambil subjek pada visi komputer dan menjadi sangat
tertarik di dalamnya; jadi untuk tesis pertamanya pada tahun 2003 ia menciptakan
program deteksi wajah real-time berdasarkan Eigenfaces, menggunakan OpenCV
(beta 3) untuk input kamera. Untuk tesis masternya pada tahun 2005 ia
menciptakan sistem navigasi visual untuk beberapa robot mobile menggunakan
OpenCV (v0.96). Dari tahun 2008, ia bekerja sebagai freelance Computer Vision
Developer di Abu Dhabi dan Filipina, menggunakan OpenCV untuk sejumlah
besar proyek-proyek komersial jangka pendek yang mencakup:
• Mendeteksi wajah menggunakan Haar atau Eigenfaces
• Mengenali wajah menggunakan Neural Networks, Ehmm, atau Eigenfaces
• Mendeteksi posisi 3D dan orientasi wajah dari satu foto menggunakan AAM
dan Posit
• Berputar wajah dalam 3D menggunakan hanya satu foto
• Wajah preprocessing dan pencahayaan buatan menggunakan segala arah 3D dari satu
foto
• pengakuan jenis kelamin
• pengenalan ekspresi wajah
• deteksi kulit
• deteksi iris
• deteksi murid
• pelacakan mata-tatapan
• pelacakan Visual-saliency
• pencocokan histogram
• deteksi tubuh ukuran
• Shirt dan bikini deteksi
• pengakuan uang
• stabilisasi video
• Pengenalan wajah pada iPhone
• Pengakuan makanan di iPhone
• Berbasis penanda augmented reality pada iPhone (kedua-tercepat iPhone augmented
aplikasi kenyataannya pada saat itu).
www.it-ebooks.info
OpenCV itu meletakkan makanan di atas meja untuk keluarga Shervin, jadi dia
mulai memberikan kembali kepada OpenCV melalui saran reguler di forum dan
dengan posting OpenCV tutorial gratis di website-nya (
http://www.shervinemami.info/openCV.html). Pada tahun 2011, ia menghubungi
para pemilik situs OpenCV gratis lainnya untuk menulis buku ini. Dia juga mulai
bekerja pada optimasi visi komputer untuk perangkat mobile di NVIDIA, bekerja
sama dengan pengembang OpenCV resmi untuk menghasilkan versi yang
dioptimalkan dari OpenCV untuk Android. Pada tahun 2012, ia juga bergabung
dengan komite Khronos OpenVL untuk standardisasi percepatan hardware visi
komputer untuk perangkat mobile, di mana OpenCV akan berbasis di masa depan.
Saya berterima kasih kepada Gay istri saya dan saya Luna bayi
untuk bertahan stres sementara aku juggled waktu antara buku ini,
bekerja fulltime, dan berkeluarga. Saya juga berterima kasih kepada
para pengembang OpenCV, yang bekerja keras selama bertahun-
tahun untuk menyediakan produk berkualitas tinggi secara gratis.
Jason Saragih menerima gelar B. Eng di mekatronik (dengan pujian) dan Ph.D.
dalam ilmu komputer dari Universitas Nasional Australia, Canberra, Australia,
pada tahun 2004 dan 2008, masing-masing. Dari 2008 sampai 2010 ia adalah sesama
Postdoctoral di Robotika Institut Carnegie Mellon University, Pittsburgh, PA. Dari
2010-2012 ia bekerja di Ilmiah dan Industri Organisasi Riset Commonwealth
(CSIRO) sebagai Scientist Research. Dia saat ini menjadi Senior Research Scientist
di Fitur Visual, sebuah perusahaan startup teknologi Australia.
Dr Saragih telah membuat sejumlah kontribusi untuk bidang visi komputer,
khususnya pada topik terdeformasi pendaftaran Model dan pemodelan. Dia
adalah penulis dari dua non-profit perpustakaan open source yang banyak
digunakan dalam komunitas ilmiah; DeMoLib dan FaceTracker, yang keduanya
memanfaatkan perpustakaan visi komputer generik termasuk OpenCV.
www.it-ebooks.info
Roy Shilkrot adalah peneliti dan profesional di bidang visi komputer dan
komputer grafis. Dia memperoleh B.Sc. Ilmu Komputer dari Tel-Aviv-Yaffo
Akademik College, dan M.Sc. dari Tel-Aviv University. Saat ini ia merupakan
kandidat PhD di Media Laboratorium Massachusetts Institute of Technology
(MIT) di Cambridge.
Roy memiliki lebih dari tujuh tahun pengalaman sebagai Software Engineer di
perusahaan start-up dan perusahaan. Sebelum bergabung dengan MIT Media Lab
sebagai Asisten Penelitian ia bekerja sebagai Strategist Teknologi di Laboratorium
Inovasi Comverse, penyedia solusi telekomunikasi. Dia juga mencoba-coba
konsultasi, dan bekerja sebagai magang untuk penelitian Microsoft di Redmond.
Luis Díaz Más menganggap dirinya visi komputer peneliti dan bergairah tentang
open source dan open-hardware masyarakat. Dia telah bekerja dengan gambar
pengolahan dan visi komputer algoritma sejak tahun 2008 dan saat ini sedang menyelesaikan
PhD
pada rekonstruksi 3D dan pengakuan tindakan. Saat ini ia bekerja di CATEC
(http://www.catec.com.es/en), Sebuah pusat penelitian untuk teknologi kedirgantaraan maju,
di mana ia terutama berkaitan dengan sistem sensoris UAV. Dia telah berpartisipasi dalam
beberapa proyek nasional dan internasional di mana ia telah membuktikan keahliannya dalam C
/ C ++
pemrograman, pengembangan aplikasi untuk sistem tertanam dengan Qt perpustakaan, dan nya
pengalaman dengan konfigurasi distribusi GNU / Linux untuk sistem embedded. Belakangan ini
ia memfokuskan minatnya di ARM
dan pengembangan CUDA.
www.it-ebooks.info
Sebastian Montabone adalah Insinyur Komputer dengan gelar Master of
Science dalam visi komputer. Dia adalah penulis artikel ilmiah yang berkaitan
dengan pengolahan gambar dan juga telah menulis sebuah buku, Awal Digital
Image Processing: Menggunakan Tools Gratis untuk Fotografer.
embedded system juga telah menarik bagi dia, khususnya ponsel. Dia
menciptakan dan mengajar kursus tentang pengembangan aplikasi untuk
ponsel, dan telah diakui sebagai juara pengembang Nokia.
Saat ini ia adalah Konsultan Software dan Pengusaha. Anda dapat mengunjungi
blog-nya diwww.samontab.com. dimana ia berbagi proyek saat ini dengan dunia.
www.it-ebooks.info
www.PacktPub.com
http://PacktLib.PacktPub.com
Apakah Anda perlu solusi instan untuk pertanyaan TI Anda? PacktLib online
buku perpustakaan digital Packt. Di sini, Anda dapat mengakses, membaca
dan mencari di seluruh perpustakaan Packt buku.
Mengapa Langganan?
• Sepenuhnya dicari di setiap buku yang diterbitkan oleh Packt
• Copy dan paste, cetak dan bookmark konten
• Pada permintaan dan diakses melalui browser web
[ iv ]
www.it-ebooks.info
Daftar Isi
[v]
www.it-ebooks.info
www.it-ebooks.info
Kata pengantar
Menguasai OpenCV dengan Proyek Visi Komputer Praktis berisi sembilan bab, dimana
setiap bab adalah tutorial untuk seluruh proyek dari awal sampai akhir, berdasarkan
antarmuka C ++ OpenCV termasuk kode sumber penuh. Penulis masing-masing bab
dipilih untuk kontribusi online mereka dianggap baik untuk masyarakat OpenCV pada
topik itu, dan buku itu ditinjau oleh salah satu pengembang OpenCV utama. Daripada
menjelaskan dasar-dasar fungsi OpenCV, ini adalah buku pertama yang menunjukkan
bagaimana
untuk menerapkan OpenCV untuk memecahkan seluruh masalah, termasuk
beberapa proyek 3D kamera (augmented reality, Struktur 3D dari Gerak, interaksi
Kinect) dan beberapa proyek analisis wajah (seperti, deteksi kulit, wajah yang
sederhana dan deteksi mata, kompleks wajah fitur pelacakan, kepala 3D estimasi
orientasi, dan pengenalan wajah), oleh karena itu membuat pendamping yang
bagus untuk buku OpenCV yang ada.
[2]
www.it-ebooks.info
Kata pengantar
konvensi
Dalam buku ini, Anda akan menemukan sejumlah gaya teks yang
membedakan antara berbagai jenis informasi. Berikut adalah beberapa
contoh dari gaya ini, dan penjelasan tentang makna mereka.
kata kode dalam teks yang ditampilkan sebagai berikut: "Anda harus
menempatkan sebagian besar kode bab ini ke dalam cartoonifyImage ()
fungsi."
[3]
www.it-ebooks.info
Kata pengantar
Ketika kita ingin menarik perhatian Anda ke bagian tertentu dari sebuah
blok kode, garis-garis yang relevan atau barang diatur dalam huruf
tebal:
Dapatkan akses ke kamera. cv :: VideoCapture capture; camera.open
(cameraNumber); if (! camera.isOpened ()) {
std :: cerr << "ERROR: Tidak dapat mengakses kamera atau video!" <<
istilah baru dan kata-kata penting yang ditampilkan dalam huruf tebal. Kata-
kata yang Anda lihat di layar, di menu atau kotak dialog misalnya, muncul
dalam teks seperti ini: "mengklik tombol Next bergerak Anda ke layar
berikutnya".
Peringatan atau catatan penting muncul dalam sebuah kotak seperti ini.
[4]
www.it-ebooks.info
Kata pengantar
dukungan pelanggan
Sekarang bahwa Anda adalah pemilik bangga sebuah buku Packt, kami memiliki
sejumlah hal untuk membantu Anda untuk mendapatkan hasil maksimal dari
pembelian Anda.
ralat
Meskipun kami telah mengambil setiap perawatan untuk memastikan keakuratan dari
konten kami, kesalahan bisa terjadi. Jika Anda menemukan kesalahan di salah satu
buku-mungkin kesalahan dalam teks atau kode-kami akan berterima kasih jika Anda
akan melaporkan ini kepada kami. Dengan demikian, Anda dapat menyimpan pembaca
lainnya dari frustrasi dan membantu kami meningkatkan versi berikutnya dari buku ini.
Jika Anda menemukan ralat, silahkan melaporkannya dengan mengunjungi http:
//www.packtpub. com / support, Memilih buku Anda, klik pada formulir pengajuan
ralat Link, dan memasuki rincian ralat Anda. Setelah ralat Anda diverifikasi, kiriman Anda
akan diterima dan ralat yang akan di-upload di website kami, atau ditambahkan ke daftar
ralat yang ada, di bawah bagian Errata dari gelar itu. Setiap ralat yang ada dapat dilihat
dengan memilih judul darihttp://www.packtpub.com/support.
Pembajakan
Pembajakan materi hak cipta di Internet adalah masalah yang sedang berlangsung
di semua media. Pada Packt, kita mengambil perlindungan hak cipta dan lisensi
kami sangat serius. Jika Anda datang di setiap salinan ilegal dari karya-karya kami,
dalam bentuk apapun, di internet, silakan berikan kami dengan alamat lokasi atau
nama website segera sehingga kita bisa mengejar obat.
Silahkan hubungi kami di copyright@packtpub.com dengan
link ke materi bajakan yang dicurigai.
Kami menghargai bantuan Anda dalam melindungi penulis kami, dan
kemampuan kita untuk membawa Anda konten yang berharga.
pertanyaan
Anda dapat menghubungi kami di questions@packtpub.com jika Anda
mengalami masalah dengan segala aspek dari buku, dan kami akan melakukan
yang terbaik untuk mengatasinya.
[5]
www.it-ebooks.info
www.it-ebooks.info
Cartoonifier dan Kulit
Changer untuk
Android
Bab ini akan menunjukkan cara untuk menulis beberapa gambar pemrosesan data
filter untuk smartphone Android dan tablet, tertulis pertama untuk desktop (di C /
C ++) dan kemudian porting ke Android (dengan sama C / C ++ kode tetapi
dengan GUI Java), karena ini adalah skenario direkomendasikan ketika
mengembangkan untuk perangkat mobile. Bab ini akan mencakup:
• Bagaimana mengkonversi gambar kehidupan nyata untuk gambar sketsa
• Bagaimana mengkonversi ke sebuah lukisan dan overlay sketsa untuk menghasilkan
kartun
• Sebuah "jahat" mode menakutkan untuk membuat karakter buruk
bukan karakter yang baik
• Sebuah detektor dasar kulit dan warna changer kulit, untuk memberikan seseorang hijau
"alien" kulit
• Bagaimana mengkonversi proyek dari aplikasi desktop ke aplikasi seluler
Kami ingin membuat frame kamera dunia nyata terlihat seperti mereka benar-
benar dari kartun. Ide dasarnya adalah untuk mengisi bagian datar dengan
beberapa warna dan kemudian menggambar garis tebal di tepi kuat. Dengan kata
lain, daerah datar harus menjadi jauh lebih datar dan ujung-ujungnya harus
menjadi jauh lebih jelas. Kami akan mendeteksi tepi dan menghaluskan daerah
datar, kemudian menarik tepi ditingkatkan kembali di atas untuk menghasilkan
kartun atau efek buku komik.
Ketika mengembangkan aplikasi visi komputer mobile, itu adalah ide yang baik
untuk membangun sebuah versi desktop sepenuhnya bekerja terlebih dahulu
sebelum porting ke ponsel, karena jauh lebih mudah untuk mengembangkan dan
men-debug program desktop dari aplikasi mobile! Bab ini karena itu akan dimulai
dengan program desktop Cartoonifier lengkap yang dapat Anda buat menggunakan
IDE favorit Anda (misalnya, Visual Studio, Xcode, Eclipse, QtCreator, dan
sebagainya). Setelah itu bekerja dengan baik pada desktop, bagian terakhir
menunjukkan bagaimana untuk port ke Android (atau berpotensi iOS) dengan
Eclipse. Karena kita akan membuat dua proyek yang berbeda yang sebagian besar
berbagi kode sumber yang sama dengan antarmuka pengguna grafis yang berbeda,
Anda bisa membuat perpustakaan yang dihubungkan oleh kedua proyek, tetapi
untuk kesederhanaan kita akan menempatkan desktop dan proyek Android
samping satu sama lain,cartoon.cpp dan cartoon.h, Yang berisi semua kode
pengolahan gambar) dari Desktopmap. Sebagai contoh:
• C: \ Cartoonifier_Desktop \ cartoon.cpp
• C: \ Cartoonifier_Desktop \ cartoon.h
• C: \ Cartoonifier_Desktop \ main_desktop.cpp
• C: \ Cartoonifier_Android \ ...
[8]
www.it-ebooks.info
Bab 1
Mengakses webcam
Untuk mengakses perangkat webcam atau kamera komputer, Anda hanya dapat
memanggil Buka() pada suatu cv :: VideoCapture objek (metode OpenCV
mengakses perangkat kamera Anda), dan lulus 0sebagai nomor ID kamera
default. Beberapa komputer telah beberapa kamera terpasang atau mereka tidak
bekerja sebagai standar kamera0; sehingga praktek umum untuk memungkinkan
pengguna untuk lulus nomor kamera yang diinginkan sebagai argumen baris
perintah, dalam kasus mereka ingin mencoba kamera 1, 2, atau -1, misalnya. Kami
juga akan mencoba untuk mengatur resolusi kamera 640 x 480 menggunakancv
:: VideoCapture :: set (), Dalam rangka untuk menjalankan lebih cepat pada
kamera resolusi tinggi.
Setelah webcam telah diinisialisasi, Anda bisa ambil gambar kamera saat ini
sebagai cv :: Matobjek (OpenCV kontainer gambar). Anda bisa ambil setiap
frame kamera dengan menggunakan C ++ Operator streaming dari Andacv
:: VideoCapture keberatan ke cv :: Mat keberatan, sama seperti jika Anda
mendapatkan masukan dari konsol.
[9]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
OpenCV membuatnya sangat mudah untuk memuat file video (seperti AVI
atau MPG file) dan menggunakannya bukan webcam. Satu-satunya
perbedaan kode Anda akan bahwa Anda harus membuatcv ::
VideoCapture keberatan dengan nama file video, seperti camera.open
( "my_video.avi"), Bukan jumlah kamera, seperti camera.open (0).
Kedua metode membuatcv :: VideoCapture objek yang dapat
digunakan dengan cara yang sama.
Masukan loop utama ini di main_desktop.cpp, Sebagai dasar untuk kamera aplikasi real-time Anda:
sementara (benar) {
Ambil frame kamera depan. cv :: Mat cameraFrame;
Kamera >> cameraFrame;
jika (cameraFrame.empty ()) {
std :: cerr << "ERROR: Bisa tidak ambil bingkai kamera."
<< std :: endl;
exit (1);
}
Buat kosong output gambar, bahwa kita akan menarik ke. cv :: Mat
displayedFrame (cameraFrame.size (), cv :: CV_8UC3);
[ 11 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Dalam gambar berikut, Anda dapat melihat gambar asli (sisi kiri) dan tepi
masker yang dihasilkan (kanan) yang terlihat mirip dengan gambar sketsa.
Setelah kami menghasilkan lukisan warna (dijelaskan kemudian), kita dapat
menempatkan tepi masker ini di atas untuk gambar garis hitam:
[ 12 ]
www.it-ebooks.info
Bab 1
Daripada menerapkan filter bilateral besar, kami akan menerapkan banyak filter
bilateral kecil untuk menghasilkan efek kartun yang kuat dalam waktu kurang.
Kami akan memotong filter (lihat gambar berikut) sehingga bukan melakukan
seluruh filter (misalnya, ukuran filter 21 x 21 ketika kurva lonceng adalah 21 piksel
lebar), itu hanya menggunakan ukuran filter minimum yang diperlukan untuk
hasil meyakinkan (misalnya, dengan ukuran filter hanya 9 x 9 bahkan jika kurva
lonceng adalah 21 piksel lebar). Filter dipotong ini akan menerapkan bagian
utama dari filter (wilayah abu-abu) tanpa membuang-buang waktu pada bagian
kecil dari filter (area putih di bawah kurva), sehingga akan menjalankan beberapa
kali lebih cepat:
Kami memiliki empat parameter yang mengontrol filter bilateral: kekuatan warna,
kekuatan posisi, ukuran, dan jumlah pengulangan. Kami membutuhkan Mat suhu
sejakbilateralFilter () tidak bisa menimpa input (disebut sebagai "di tempat
pengolahan"), tapi kita dapat menerapkan satu filter menyimpan Mat temp dan
filter lain menyimpan kembali ke input:
Mat tmp = Mat // kekuatan Filter warna.
(smallSize,
CV_8UC3);
// kekuatan Ruang. Mempengaruhi
int pengulangan = 7; // kecepatan. Pengulangan untuk
efek kartun yang kuat.
for (int i = 0; i <pengulangan; i ++) {
int ksize = 9; // ukuran Filter. Memiliki dampak yang besar pada
kecepatan.
ganda sigmaColor = 9;
ganda sigmaSpace = 7;
bilateralFilter (smallImg, tmp, ksize, sigmaColor,
sigmaSpace); bilateralFilter (tmp, smallImg, ksize,
sigmaColor, sigmaSpace);
}
[ 13 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Ingatlah bahwa ini diaplikasikan pada gambar menyusut, jadi kita perlu
memperluas gambar kembali ke ukuran aslinya. Kemudian kita dapat overlay
topeng tepi yang kami temukan sebelumnya. Untuk overlay tepi topeng "sketsa"
ke bilateral filter "lukisan" (sisi kiri dari gambar berikut), kita bisa mulai dengan
latar belakang hitam dan menyalin "lukisan" piksel yang tidak tepi dalam
"sketsa" topeng:
Mat bigImg;
mengubah ukuran (smallImg, bigImg, ukuran, 0,0,
INTER_LINEAR); dst.setTo (0);
bigImg.copyTo (dst, masker);
Hasilnya adalah versi kartun dari foto asli, seperti yang ditunjukkan pada sisi
kanan gambar, di mana "sketsa" mask overlay pada "lukisan":
[ 14 ]
www.it-ebooks.info
Bab 1
Mat abu-abu;
cvtColor (srcColor, abu-abu, CV_BGR2GRAY); const
int MEDIAN_BLUR_FILTER_SIZE = 7; medianBlur
(abu-abu, abu-abu, MEDIAN_BLUR_FILTER_SIZE);
tepi tikar, edges2;
Scharr (srcGray, tepi, CV_8U, 1, 0);
Scharr (srcGray, edges2, CV_8U, 1, 0, -1);
tepi + = edges2; // Gabungkan x & y tepi bersama-sama.
const int EVIL_EDGE_THRESHOLD = 12;
ambang batas (tepi, masker, EVIL_EDGE_THRESHOLD, 255,
THRESH_BINARY_INV); medianBlur (masker, masker, 3);
Sekarang bahwa kita memiliki "jahat" topeng, kita dapat overlay masker ini ke
cartoonified "lukisan" gambar seperti yang kami lakukan dengan rutin "sketsa"
tepi masker. Hasil akhir ditampilkan di sisi kanan gambar berikut:
[ 15 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
algoritma kulit-deteksi
Ada banyak teknik yang berbeda digunakan untuk mendeteksi daerah kulit, dari
ambang batas warna yang sederhana menggunakan RGB (Red-Green-Blue) atau HSV
(Hue-Saturation-Brightness) nilai atau histogram warna perhitungan dan proyeksi
ulang, algoritma mesin-belajar yang kompleks model campuran bahwa kamera perlu
kalibrasi dalam ruang warna CIELAB dan pelatihan secara offline dengan banyak wajah
sampel, dan sebagainya. Tetapi bahkan metode yang kompleks tidak selalu bekerja
dengan kuat di berbagai kamera dan pencahayaan kondisi dan jenis kulit. Karena kita
ingin deteksi kulit kita untuk berjalan pada perangkat mobile tanpa kalibrasi atau
pelatihan, dan kami hanya menggunakan deteksi kulit untuk "bersenang-senang" filter
gambar, itu sudah cukup bagi kita untuk menggunakan metode kulit-deteksi sederhana.
Namun, respon warna dari sensor kamera kecil di perangkat mobile cenderung
bervariasi secara signifikan,
Sebagai contoh, detektor kulit HSV sederhana dapat mengobati pixel setiap kulit
jika rona cukup merah, saturasi cukup tinggi tetapi tidak sangat tinggi, dan
kecerahan tidak terlalu gelap atau terlalu terang. Tapi kamera ponsel sering
memiliki keseimbangan putih yang buruk, dan sehingga kulit seseorang mungkin
terlihat sedikit biru bukan merah, dan seterusnya, dan ini akan menjadi masalah
besar untuk sederhana HSV thresholding.
Solusi yang lebih kuat adalah dengan melakukan deteksi wajah dengan Haar atau
LBP cascade classifier (ditampilkan dalam Bab 8, Face Recognition menggunakan
Eigenfaces), dan kemudian melihat berbagai warna untuk pixel di tengah wajah
yang terdeteksi karena Anda tahu bahwa mereka piksel harus piksel kulit orang
yang sebenarnya. Anda kemudian bisa memindai seluruh gambar atau daerah
terdekat untuk piksel dari warna yang sama sebagai pusat wajah. Hal ini memiliki
keuntungan bahwa sangat mungkin untuk menemukan setidaknya beberapa
daerah kulit yang benar dari setiap orang yang terdeteksi tidak peduli apa warna
kulit mereka atau bahkan jika kulit mereka muncul agak biru atau merah pada
gambar kamera.
[ 16 ]
www.it-ebooks.info
Bab 1
Untuk membuatnya lebih jelas bahwa itu adalah wajah, mari kita juga
menggambar dua garis mata. Daripada menggambar mata sebagai elips, kita
bisa membuatnya sedikit lebih realistis (lihat gambar berikut) dengan
menggambar elips terpotong untuk bagian atas mata dan elips terpotong untuk
bagian bawah mata, karena kita dapat menentukan memulai dan mengakhiri
sudut ketika menggambar denganelips():
Menggambar garis mata, seperti 2 busur per mata. int eyeW = faceW *
23/100;int eyeH = faceH * 11/100;
int eyeX = faceW * 48/100;
[ 17 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Kita dapat menggunakan metode yang sama untuk menarik bibir bawah mulut:
Menarik bibir bawah mulut. int mouthy = faceH * 48/100;int
mouthW = faceW * 45/100;
int mouthH = faceH * 6/100;
elips (faceOutline, Point (sw / 2, sh / 2 + mouthy), Size (mouthW,
mouthH), 0, 0, 180, warna, ketebalan, CV_AA);
Untuk membuatnya lebih jelas bahwa pengguna harus memasang wajah mereka di
mana ditampilkan, mari kita menulis pesan di layar!
// Menggambar teks anti-alias.
int fontFace = FONT_HERSHEY_COMPLEX;
mengapung fontScale = 1.0f;
int fontThickness = 2;
char * szMsg = "Masukan wajah Anda di sini";
putText (faceOutline, szMsg, Point (sw * 23/100, sh * 10/100),
fontFace, fontScale, warna, fontThickness, CV_AA);
Sekarang kita telah menghadapi garis ditarik, kita dapat overlay itu ke gambar
yang ditampilkan dengan menggunakan alpha blending untuk
menggabungkan gambar cartoonified dengan garis yang ditarik ini:
addWeighted (dst, 1,0, faceOutline, 0,7, 0, dst, CV_8UC3);
[ 18 ]
www.it-ebooks.info
Bab 1
Hal ini menyebabkan garis pada gambar berikut, yang menunjukkan pengguna
di mana harus menempatkan wajah mereka sehingga kita tidak perlu
mendeteksi lokasi wajah:
[ 19 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
perubahan warna kulit tidak bekerja dengan baik dalam warna-ruang RGB. Hal ini
karena Anda ingin mengizinkan kecerahan bervariasi di wajah tapi tidak
memungkinkan warna kulit bervariasi banyak, dan RGB tidak kecerahan terpisah
dari warna. Salah satu solusi adalah dengan menggunakan warna-ruang Hue-
Saturation-Brightness (HSV), karena memisahkan kecerahan dari warna (hue) serta
colorfulness (saturasi). Sayangnya, HSV membungkus nilai hue sekitar merah, dan
karena kulit sebagian besar merah itu berarti bahwa Anda perlu untuk bekerja baik
dengan rona kurang dari 10 persen dan rona yang lebih besar dari 90 persen, karena
ini keduanya merah. Dengan demikian, kita akan sebaliknya menggunakan Y'CrCb
warna-ruang (varian dari YUV, yang di OpenCV), karena memisahkan kecerahan
dari warna, dan hanya memiliki jangkauan tunggal nilai untuk warna kulit yang
khas daripada dua. Perhatikan bahwa kamera yang paling, gambar,
Karena kita ingin modus alien kami terlihat seperti kartun, kita akan menerapkan
filter alien setelah gambar telah cartoonified; dengan kata lain, kita memiliki akses
ke gambar warna menyusut diproduksi oleh filter bilateral, dan ke tepi masker
berukuran penuh. deteksi kulit sering bekerja lebih baik pada resolusi rendah,
karena itu adalah setara dengan menganalisa nilai rata-rata tetangga masing-
masing resolusi tinggi pixel (atau sinyal frekuensi rendah bukan sinyal bising
frekuensi tinggi). Jadi mari kita bekerja di skala menyusut sama dengan filter
bilateral (setengah lebar dan setengah tinggi). Mari kita mengkonversi gambar
lukisan ke YUV:
Mat YUV = Mat (smallSize, CV_8UC3);
cvtColor (smallImg, YUV, CV_BGR2YCrCb);
Kita juga perlu untuk mengecilkan tepi masker sehingga pada skala yang sama
dengan gambar lukisan. Ada komplikasi dengan OpenCVfloodfill ()Fungsi saat
menyimpan ke gambar topeng terpisah, bahwa topeng harus memiliki batas 1-pixel
di sekitar seluruh gambar, jadi jika citra input H piksel W x dalam ukuran, gambar
topeng yang terpisah harus (W + 2) x (H + 2) piksel dalam ukuran. Tapifloodfill
()juga memungkinkan kita untuk menginisialisasi masker dengan tepi bahwa
algoritma banjir mengisi akan memastikan itu tidak menyeberang. Mari kita gunakan
fitur ini dengan harapan bahwa hal ini membantu mencegah banjir mengisi dari
memperluas luar wajah. Jadi kita perlu menyediakan dua gambar topeng: topeng
tepi yang mengukur W x H dalam ukuran, dan tepi topeng yang sama tetapi
mengukur (W + 2) x (H + 2) dalam ukuran karena harus mencakup perbatasan di
sekitar gambar. Hal ini dimungkinkan untuk memiliki beberapacv :: Mat benda
(atau header) referensi data yang sama, atau bahkan untuk memiliki cv :: Mat objek
yang referensi sub-wilayah lain cv :: Matgambar. Jadi, bukannya mengalokasikan
dua gambar terpisah dan menyalin piksel tepi masker di, mari kita mengalokasikan
gambar topeng tunggal termasuk perbatasan, dan menciptakan tambahancv ::
Matheader W x H (yang hanya merujuk daerah bunga dalam banjir mengisi topeng
tanpa perbatasan). Dengan kata lain, hanya ada satu array piksel ukuran (W + 2) x (H
+ 2) tapi duacv :: Mat benda, di mana satu adalah referensi keseluruhan (W + 2) x
(H + 2) gambar dan yang lainnya adalah referensi wilayah H W x di tengah-tengah
gambar yang:
[ 20 ]
www.it-ebooks.info
Bab 1
int sw = smallSize.width;
int sh = smallSize.height;
Mat masker, maskPlusBorder;
maskPlusBorder = Mat :: nol (sh + 2, sw + 2, CV_8UC1);
topeng = maskPlusBorder (Rect (1,1, sw, sh)); // masker di maskPlusBorder.
mengubah ukuran (tepi, masker, smallSize); // Masukan tepi di keduanya.
Tepi masker (ditampilkan di sisi kiri gambar berikut) penuh kedua tepi kuat dan
lemah; tapi kami hanya ingin tepi yang kuat, jadi kami akan menerapkan
ambang biner (menghasilkan gambar tengah pada gambar berikut). Untuk
bergabung dengan beberapa kesenjangan antara tepi kita kemudian akan
menggabungkan operator morfologimelebarkan() dan mengikis () untuk
menghapus beberapa kesenjangan (juga disebut sebagai operator "dekat"),
sehingga sisi kanan gambar:
const int EDGES_THRESHOLD = 80;
threshold (masker, masker, EDGES_THRESHOLD, 255, THRESH_BINARY);
membesar (masker, masker, Mat ());
mengikis (masker, masker, Mat ());
[ 21 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Sekarang kita hanya perlu menemukan beberapa batas bawah dan atas yang
baik untuk banjir mengisi. Ingatlah bahwa ini sedang dilakukan dalam ruang
warna Y'CrCb, jadi kami pada dasarnya memutuskan berapa banyak kecerahan,
komponen merah, dan komponen biru dapat bervariasi. Kami ingin
memungkinkan kecerahan untuk bervariasi banyak, untuk memasukkan
bayangan serta highlight dan refleksi, tapi kami tidak ingin warna bervariasi
banyak sekali:
const int LOWER_Y = 60;
const int UPPER_Y = 80;
const int LOWER_Cr = 25;
const int UPPER_Cr = 15;
const int LOWER_Cb = 20;
const int UPPER_Cb = 15;
Skalar (LOWER_Y, LOWER_Cr,
Skalar lowerDiff = LOWER_Cb);
Skalar (UPPER_Y, UPPER_Cr,
Skalar upperDiff = UPPER_Cb);
Dalam gambar berikut, sisi kiri menunjukkan enam banjir mengisi lokasi (ditampilkan
sebagai lingkaran biru), dan sisi kanan angka menunjukkan topeng eksternal yang
dihasilkan, di mana kulit ditampilkan sebagai abu-abu dan tepi ditampilkan sebagai
putih. Perhatikan bahwa gambar sisi kanan dimodifikasi untuk buku ini sehingga
piksel kulit (nilai 1) yang jelas terlihat:
[ 22 ]
www.it-ebooks.info
Bab 1
Itu topeng image (ditampilkan di sisi kanan dari angka sebelumnya) sekarang berisi:
• piksel dari nilai 255 untuk piksel tepi
• piksel dari nilai 1 untuk daerah kulit
• piksel dari nilai 0 untuk sisanya
Sementara itu, edgeMaskhanya berisi piksel tepi (sebagai nilai 255). Jadi untuk
mendapatkan hanya piksel kulit, kita dapat menghapus tepi dari itu:
mask - = edgeMask;
Itu topenggambar sekarang hanya berisi 1s untuk piksel kulit dan 0s untuk
piksel non-kulit. Untuk mengubah warna kulit dan kecerahan gambar asli, kita
bisa menggunakancv :: menambahkan () dengan kulit masker untuk
meningkatkan komponen hijau pada gambar BGR asli:
int Merah = 0;
int Hijau = 70;
int Biru = 0;
tambahkan (smallImgBGR, CV_RGB (Red, Green, Blue), smallImgBGR, masker);
Gambar berikut ini menunjukkan gambar asli di sebelah kiri, dan final alien gambar
kartun di sebelah kanan, di mana setidaknya enam bagian wajah sekarang akan
menjadi hijau!
Perhatikan bahwa kita tidak hanya membuat kulit tampak hijau tetapi juga cerah
(terlihat seperti alien yang bersinar dalam gelap). Jika Anda ingin hanya mengubah
warna kulit tanpa membuatnya lebih cerah, Anda dapat menggunakan metode
berubah warna lain, seperti menambahkan 70 ke hijau sementara mengurangkan 70
dari merah dan biru, atau dikonversi ke ruang warna HSV menggunakan cvtColor
(src, dst, "CV_BGR2HSV_FULL"), Dan menyesuaikan warna dan saturasi.
Itu saja! Menjalankan aplikasi dalam mode yang berbeda sampai Anda
siap untuk port ke ponsel Anda.
[ 23 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Antarmuka pengguna aplikasi Android harus ditulis menggunakan Java, tapi untuk
pengolahan gambar yang akan kita gunakan sama cartoon.cppC ++ file yang kita
digunakan untuk desktop. Untuk menggunakan C / C ++ kode dalam sebuah
aplikasi Android, kita harus menggunakan NDK (asli Development Kit) yang
didasarkan pada JNI (Java Native Interface). Kami akan membuat wrapper JNI
untuk kamicartoonifyImage () fungsi sehingga dapat digunakan dari Android
dengan Java.
[ 24 ]
www.it-ebooks.info
Bab 1
[ 25 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Mari kita mulai dengan sesuatu yang sederhana: mendapatkan akses ke frame
kamera di OpenCV tapi tidak memproses itu, dan bukan hanya menampilkan
pada layar. Hal ini dapat dilakukan dengan mudah dengan kode Java, tetapi
penting untuk mengetahui bagaimana melakukannya menggunakan OpenCV
juga. Seperti disebutkan sebelumnya, gambar kamera tiba di kode C ++ kami
diYUV420spFormat dan harus meninggalkan dalam format BGRA. Jadi, jika kita
mempersiapkan kamicv :: Mat untuk input dan output, kita hanya perlu
mengkonversi dari YUV420sp untuk BGRA menggunakan cvtColor. Untuk
menulis C / C ++ kode untuk aplikasi Android Java, kita perlu menggunakan
nama fungsi JNI khusus yang sesuai dengan nama Java kelas dan paket yang
akan menggunakan fungsi JNI, dalam format:
JNIEXPORT <Return> JNICALL Java_ <Package> _ <Kelas> _ <Fungsi>
(JNIEnv * env, jobject, <Args>)
[ 26 ]
www.it-ebooks.info
Bab 1
Sementara kode ini terlihat kompleks pada awalnya, dua baris pertama dari fungsi
hanya memberi kita akses asli array Java yang diberikan, dua baris berikutnya
membangun cv :: Mat benda di sekitar buffer pixel yang diberikan (yaitu, mereka
tidak mengalokasikan gambar baru, mereka membuat myuv mengakses piksel di
_yuv array, dan sebagainya), dan dua baris terakhir dari Fungsi melepaskan kunci
asli kita ditempatkan pada array Jawa. Satu-satunya karya nyata yang kita lakukan
dalam fungsi adalah untuk mengkonversi dari YUV ke format BGRA, sehingga
fungsi ini adalah dasar yang dapat kita gunakan untuk fungsi-fungsi baru.
Sekarang mari kita memperpanjang ini untuk menganalisis dan memodifikasi
BGRAcv :: Mat sebelum layar.
Itu JNI \ jni_part.cpp Kode contoh dalam OpenCV v2.4.2 menggunakan kode ini:
cvtColor (myuv, mbgra, CV_YUV420sp2BGR, 4);
Karena kita sekarang memiliki citra BGRA sebagai input dan output bukan default OpenCV
BGR, ia meninggalkan kita dengan dua pilihan untuk bagaimana proses itu:
• Konversi dari BGRA ke BGR sebelum kita melakukan pengolahan citra kami, melakukan yang
pengolahan di BGR, dan kemudian dikonversi output ke BGRA sehingga dapat ditampilkan dengan
Android
• Memodifikasi semua kode kita untuk menangani format BGRA selain (atau bukan)
Format BGR,
jadi kita tidak perlu melakukan konversi lambat antara BGRA dan BGR
[ 27 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Untuk mempermudah, kita hanya akan menerapkan konversi warna dari BGRA
BGR dan kembali, daripada mendukung baik BGR dan BGRA format. Jika Anda
menulis aplikasi real-time, Anda harus mempertimbangkan menambahkan 4-
channel BGRA dukungan dalam kode Anda untuk berpotensi meningkatkan
kinerja. Kami akan melakukan satu perubahan sederhana untuk membuat hal-hal
sedikit lebih cepat: kita mengkonversi input dariYUV420sp untuk BGRA dan
kemudian dari BGRA BGR, jadi kami mungkin juga hanya mengkonversi
langsung dari YUV420sp BGR!
Ini adalah ide yang baik untuk membangun dan menjalankan dengan ShowPreview
()Fungsi (ditunjukkan sebelumnya) pada perangkat Anda sehingga Anda memiliki
sesuatu untuk kembali ke jika Anda memiliki masalah dengan C Anda / C ++ kode
kemudian. Untuk menyebutnya dari Jawa, kita tambahkan deklarasi Jawa hanya di sebelah
deklarasi JawaCartoonifyImage () dekat bagian bawah CartoonifyView.java:
masyarakat asli kekosongan ShowPreview (int lebar,
tinggi int, byte [] YUV, int [] RGBA);
2. Tambahkan path file header pencarian sehingga dapat menemukan cartoon.h di folder
induk yang sama:
[ 28 ]
www.it-ebooks.info
Bab 1
4. Tambahkan fungsi JNI CartoonifyImage ()ke berkas ini; ini akan cartoonify gambar. Kita bisa mulai
dengan menduplikasi fungsiShowPreview () kita buat sebelumnya, yang hanya menunjukkan preview
kamera tanpa memodifikasi itu.
Perhatikan bahwa kita mengubah langsung dari YUV420sp BGR
karena kita tidak ingin proses BGRA gambar:
Memodifikasi gambar kamera menggunakan filter Cartoonifier.
JNIEXPORT batal
JNICALL Java_com_Cartoonifier_CartoonifierView_CartoonifyImage (JNIEnv * env,
jobject,
Jint lebar, tinggi Jint, jbyteArray YUV, jintArray bgra)
{
Dapatkan akses asli array Java yang diberikan.
jbyte * _yuv = env-> GetByteArrayElements (YUV,
0); Jint * _bgra = env-> GetIntArrayElements
(bgra, 0);
Buat bungkus OpenCV sekitar input & output data. Mat myuv (tinggi
+ tinggi / 2, lebar, CV_8UC1, (uchar *) _ YUV); mbgra Mat (tinggi, lebar, CV_8UC4,
(uchar *) _ bgra);
OpenCV sekarang dapat mengakses / memodifikasi BGR image "mbgr", dan harus
menyimpan output sebagai BGR image "displayedFrame".
Mat displayedFrame (mbgr.size (), CV_8UC3);
[ 29 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
5. kode sebelumnya tidak memodifikasi gambar, tapi kami ingin mengolah gambar
menggunakan cartoonifier kami kembangkan awal bab ini. Jadi sekarang mari kita masukkan
panggilan yang ada kamicartoonifyImage () fungsi yang kita buat di cartoon.cpp untuk
aplikasi desktop. menggantikan baris sementara kode displayedFrame = mbgr dengan ini:
cartoonifyImage (mbgr, displayedFrame);
6. Itu saja! Membangun kode (Eclipse harus mengkompilasi C / C ++ kode untuk Anda
menggunakanNDK-build) Dan menjalankannya pada perangkat Anda. Anda harus memiliki kerja
yang
aplikasi Cartoonifier Android (tepat di awal bab ini ada screenshot sampel
menunjukkan apa yang harus Anda harapkan)! Jika tidak membangun atau
menjalankan, kembali di atas langkah-langkah dan memperbaiki masalah
(lihat kode yang disediakan dengan buku ini jika Anda inginkan).
Lanjutkan dengan langkah selanjutnya setelah bekerja.
• Hal ini sangat lambat; banyak detik per frame! Jadi kita hanya harus menampilkan kamera
pratinjau dan hanya cartoonify bingkai kamera ketika pengguna telah menyentuh layar untuk
mengatakan itu adalah foto yang baik.
• Perlu untuk menangani input pengguna, seperti untuk mengubah mode antara sketsa, cat, jahat,
atau mode alien. Kami akan menambahkan ini ke menu bar Android.
• Ini akan menjadi besar jika kita bisa menyimpan hasil cartoonified untuk file gambar,
untuk berbagi dengan
orang lain. Setiap kali pengguna menyentuh layar untuk gambar cartoonified, kami akan
menyimpan hasilnya sebagai file gambar pada kartu SD pengguna dan menampilkannya di Galeri
Android.
• Ada banyak suara acak di detektor tepi sketsa. Kami akan membuat khusus filter "pepper"
pengurangan kebisingan untuk menangani ini nanti.
[ 30 ]
www.it-ebooks.info
Bab 1
impor android.view.View;
impor android.view.View.OnTouchListener;
impor android.view.MotionEvent;
[ 31 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
[ 32 ]
www.it-ebooks.info
Bab 1
bFreezeOutput = true;
kembali bmp;
}
8. Anda harus dapat membangun dan menjalankan untuk memverifikasi bahwa aplikasi
bekerja dengan baik sekarang.
1. Android bitmapkelas dapat menyimpan file ke format PNG, jadi mari kita menggunakannya.
Juga, kita perlu memilih nama file untuk gambar. Mari kita gunakan tanggal dan waktu, untuk
memungkinkan menyimpan banyak file dan sehingga memungkinkan bagi pengguna untuk
diingat ketika itu diambil. Masukkan ini sebelumkembali bmp pernyataan dari processFrame ():
jika (bFreezeOutput) {
// Dapatkan tanggal saat & waktu
SimpleDateFormat s = new SimpleDateFormat ( "yyyy-MM-dd, HH-mm-ss");
[ 33 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Simpan gambar diproses sebagai file PNG pada kartu SD dan acara
di Galeri Android.
savePNGImageToGallery (bmp, mContext,
baseFilename); }
[ 34 ]
www.it-ebooks.info
Bab 1
Environment.DIRECTORY_PICTURES) .getAbsolutePath ()
\ + "/";
File file = new File (baseFolder + baseFilename);
Log.i (TAG, "Menyimpan gambar diproses ke file [" +
\ File.getAbsolutePath () + "]");
// Buka file.
OutputStream out = BufferedOutputStream baru (baru
FileOutputStream (file));
Simpan file gambar sebagai bmp.compress (CompressFormat.PNG, 100,
PNG. keluar);
Pastikan disimpan ke file segera, karena kita akan
untuk menambahkannya ke Galeri.
out.flush ();
out.close ();
}
catch (Exception e) {
e.printStackTrace ();
}
}
6. aplikasi Android membutuhkan izin dari pengguna pada saat instalasi jika mereka perlu untuk
menyimpan file pada perangkat. Jadi masukkan baris ini diAndroidManifest.xml hanya di sebelah
garis serupa meminta izin untuk akses kamera:
<Kegunaan-izin
android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
[ 35 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
7. Membangun dan menjalankan aplikasi! Ketika Anda menyentuh layar untuk menyimpan foto,
Anda harus akhirnya melihat gambar cartoonified ditampilkan di layar (mungkin setelah 5 atau 10
detik dari pengolahan). Setelah itu ditampilkan di layar, itu berarti harus disimpan ke kartu SD
Anda dan ke galeri foto Anda. Keluar dari aplikasi Cartoonifier, buka aplikasi Android Gallery, dan
melihat album Foto. Anda harus melihat gambar kartun sebagai gambar PNG dalam resolusi penuh
layar Anda.
Menampilkan pesan
pemberitahuan Android tentang
gambar yang disimpan
Jika Anda ingin menampilkan pesan pemberitahuan setiap kali gambar baru disimpan
ke kartu SD dan Galeri Android, ikuti langkah-langkah; jika tidak merasa bebas untuk
melewati bagian ini:
[ 36 ]
www.it-ebooks.info
Bab 1
context.getSystemService (Context.NOTIFICATION_SERVICE);
5. Sekali lagi, membangun dan menjalankan aplikasi! Anda akan melihat pesan pemberitahuan
muncul setiap kali Anda menyentuh layar untuk gambar lain disimpan. Jika Anda ingin pesan
pemberitahuan untuk pop up sebelum penundaan panjang pengolahan gambar daripada setelah,
memindahkan panggilan untukshowNotificationMessage () sebelum panggilan untuk
cartoonifyImage (), Dan memindahkan kode untuk menghasilkan tanggal dan waktu tali
sehingga string yang sama diberikan kepada pesan pemberitahuan dan file yang sebenarnya
disimpan.
1. Menambahkan header berikut di dekat bagian atas file src \ com \ Cartoonifier \
CartoonifierApp.java:
impor android.view.Menu;
impor android.view.MenuItem;
[ 37 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
[ 38 ]
www.it-ebooks.info
Bab 1
m_alienMode = m_alienMode!;
}
void dilindungi toggleEvilMode () {
m_evilMode = m_evilMode!;
}
void dilindungi toggleDebugMode () {
m_debugMode = m_debugMode!;
}
6. Kita harus lulus nilai modus ke cartoonifyImage ()kode JNI, jadi mari kita mengirim mereka
sebagai argumen. Memodifikasi deklarasi Jawa
CartoonifyImage () di CartoonifierView:
masyarakat asli kekosongan CartoonifyImage (int lebar,
int tinggi, byte [] YUV,
int [] RGBA, sketchMode boolean, alienMode
boolean, evilMode boolean, DebugMode boolean);
7. Sekarang memodifikasi kode Java sehingga kami melewati nilai-nilai modus saat ini
di processFrame ():
CartoonifyImage (getFrameWidth (), getFrameHeight (),
data, RGBA,
m_sketchMode, m_alienMode, m_evilMode, m_debugMode);
9. Kami kemudian harus lulus mode ke C / C ++ kode dalam cartoon.cpp dari fungsi JNI di JNI \
jni_part.cpp. Ketika mengembangkan untuk Android kita hanya bisa menampilkan satu window
GUI pada satu waktu, tetapi pada desktop sangat berguna untuk menampilkan jendela ekstra saat
debugging. Jadi, bukannya mengambil bendera Boolean untukDebugMode, Mari kita lulus nomor
yang akan 0 untuk non-debug, 1 untuk debug pada ponsel (di mana menciptakan jendela GUI di
OpenCV akan menyebabkan crash!), dan 2 untuk debug pada desktop yang (di mana kita dapat
menciptakan jendela ekstra seperti yang kita inginkan):
int debugType = 0;
jika (DebugMode)
debugType = 1;
12. Membangun dan menjalankannya; kemudian mencoba menekan kecil tombol pilihan-menu di
bagian bawah jendela. Anda harus menemukan bahwa modus sketsa adalah real-time, sedangkan
modus cat memiliki penundaan besar karena filter bilateral.
[ 40 ]
www.it-ebooks.info
Bab 1
Gambar berikut ini menunjukkan gambar asli dari tablet Android di sisi kiri,
dengan modus sketsa di pusat (yang menunjukkan titik-titik hitam kecil pepper
noise), dan hasil dari penghapusan lada-noise kami ditampilkan di sisi kanan, di
mana kulit tampak lebih bersih:
Kode berikut dapat disebut sebagai fungsi removePepperNoise (). Fungsi ini
akan mengedit gambar di tempat untuk kesederhanaan:
kekosongan removePepperNoise (Mat & mask)
{
untuk (int y = 2; y <mask.rows-2; y ++) {
Dapatkan akses ke masing-masing 5 baris dekat pixel ini. uchar * pUp2 =
mask.ptr (y-2);
uchar * Pup 1 = mask.ptr (y-1);
uchar * pThis = mask.ptr (y);
uchar * pDown1 = mask.ptr (y + 1);
uchar * pDown2 = mask.ptr (y + 2);
[ 41 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
[ 42 ]
www.it-ebooks.info
Bab 1
[ 43 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
Metode yang mudah untuk mendapatkan resolusi pratinjau tertinggi dari kamera
adalah untuk lulus ukuran besar seperti 10.000 x 10.000 dan akan memilih resolusi
maksimum yang tersedia (perhatikan bahwa hal itu hanya akan memberikan
resolusi pratinjau maksimum, yang merupakan resolusi video kamera dan Oleh
karena itu seringkali jauh kurang dari resolusi masih-gambar kamera). Atau jika
Anda ingin menjalankannya benar-benar cepat, melewati 1 x 1 dan akan
menemukan resolusi pratinjau kamera termurah (misalnya 160 x 120) untuk
Anda.
Menyesuaikan aplikasi
Sekarang bahwa Anda telah membuat seluruh aplikasi Android Cartoonifier, Anda
harus mengetahui dasar-dasar cara kerjanya dan bagian mana melakukan apa;
Anda harus menyesuaikannya! Mengubah GUI, perilaku aplikasi dan alur kerja,
konstanta penyaring cartoonifier, algoritma detektor kulit, atau mengganti kode
cartoonifier dengan ide-ide Anda sendiri.
Anda dapat meningkatkan algoritma kulit-deteksi dalam banyak cara, seperti
dengan menggunakan algoritma kulit deteksi yang lebih kompleks (misalnya,
menggunakan model Gaussian dilatih dari berbagai CVPR atau konferensi ICCV
kertas terbaru di http: //www.cvpapers. com) Atau dengan menambahkan deteksi
wajah (lihat bagian Face Detection dari Bab 8, Face Recognition menggunakan
Eigenfaces) ke detektor kulit, sehingga mendeteksi di mana wajah pengguna adalah
daripada meminta pengguna untuk menempatkan wajah mereka di tengah layar .
Hati-hati bahwa deteksi wajah dapat mengambil banyak detik pada beberapa
perangkat atau kamera resolusi tinggi, sehingga pendekatan ini mungkin dibatasi
oleh kecepatan pemrosesan yang relatif lambat, tetapi smartphone dan tablet
semakin signifikan lebih cepat setiap tahun,
jadi ini akan menjadi kurang dari masalah.
Cara yang paling signifikan untuk mempercepat aplikasi visi komputer mobile
untuk mengurangi resolusi kamera sebanyak mungkin (misalnya, 0,5 megapixel
bukannya 5 megapiksel), mengalokasikan dan gambar bebas sebagai jarang
mungkin, dan melakukan konversi gambar sebagai jarang sebagai mungkin
(misalnya, dengan mendukung BGRA gambar seluruh kode Anda). Anda juga
dapat mencari gambar yang optimal pengolahan atau matematika perpustakaan
dari vendor CPU perangkat Anda (misalnya, NVIDIA Tegra, Texas Instruments
OMAP, Samsung Exynos, Apple Axe, atau Qualcomm Snapdragon) atau untuk
keluarga CPU Anda (misalnya, ARM Cortex-A9). Ingat, mungkin ada versi yang
dioptimalkan dari OpenCV untuk perangkat Anda.
Untuk membuat menyesuaikan NDK dan kode desktop yang image processing
lebih mudah, buku ini dilengkapi dengan file ImageUtils.cpp dan
ImageUtils.huntuk membantu percobaan Anda. Ini mencakup fungsi
sepertiprintMatInfo (), Yang mencetak banyak informasi tentang cv :: Matobjek,
membuat debugging OpenCV lebih mudah. Ada juga waktu macro untuk dengan
mudah menambahkan statistik waktu rinci untuk Anda C / C ++ kode. Sebagai
contoh:
DECLARE_TIMING (myFilter);
[ 44 ]
www.it-ebooks.info
Bab 1
START_TIMING (myFilter);
bilateralFilter (img, ...);
STOP_TIMING (myFilter);
SHOW_TIMING (myFilter, "Filter saya");
}
Anda kemudian akan melihat sesuatu seperti berikut dicetak ke konsol Anda:
masukan: 800w600h 8bpp 3ch, berbagai [19.255] [17.243] [47.251]
Filter saya: Waktu: 213ms (Ave = 215ms min = 197ms max = 312ms, di 57 berjalan).
Hal ini berguna ketika kode OpenCV Anda tidak bekerja seperti yang diharapkan;
terutama untuk pengembangan mobile di mana seringkali cukup sulit untuk
menggunakan debugger IDE, danprintf () pernyataan umumnya tidak akan
bekerja di Android NDK. Namun, fungsi dalam ImageUtils bekerja pada kedua
Android dan desktop.
Ringkasan
Bab ini telah menunjukkan beberapa jenis filter image processing yang dapat
digunakan untuk menghasilkan berbagai efek kartun: mode sketsa polos yang
terlihat seperti gambar pensil, modus cat yang terlihat seperti lukisan warna, dan
mode kartun yang menghamparkan modus sketsa di atas modus cat untuk
membuat gambar tampak seperti kartun. Hal ini juga menunjukkan bahwa efek
menyenangkan lainnya dapat diperoleh, seperti modus kejahatan yang sangat
meningkatkan tepi berisik, dan modus alien yang mengubah kulit wajah tampak
hijau terang.
Ada banyak aplikasi smartphone komersial yang melakukan efek menyenangkan yang
sama pada wajah pengguna, seperti filter kartun dan penukaran warna kulit. Ada juga
alat profesional menggunakan konsep serupa, seperti alat-alat video pasca-pengolahan
kulit-smoothing yang berusaha untuk mempercantik wajah perempuan dengan
menghaluskan kulit mereka sambil menjaga tepi dan daerah non-kulit yang tajam, untuk
membuat wajah mereka tampak lebih muda.
Bab ini menunjukkan bagaimana port aplikasi dari aplikasi desktop ke aplikasi
seluler Android, dengan mengikuti pedoman yang direkomendasikan
mengembangkan versi desktop kerja pertama, porting ke aplikasi mobile, dan
menciptakan user interface yang cocok untuk aplikasi seluler . Kode gambar-
pengolahan dibagi antara dua proyek sehingga pembaca dapat memodifikasi filter
kartun untuk aplikasi desktop, dan dengan membangun kembali aplikasi Android
secara otomatis harus menunjukkan modifikasi mereka di aplikasi Android juga.
[ 45 ]
www.it-ebooks.info
Cartoonifier dan Kulit Changer untuk Android
[ 46 ]
www.it-ebooks.info
Berbasis penanda
Augmented
Kenyataan di iPhone atau
iPad
augmented reality (AR) adalah pandangan hidup dari lingkungan dunia nyata
yang unsur-unsurnya ditambah dengan grafis yang dihasilkan komputer.
Akibatnya, teknologi fungsi dengan meningkatkan persepsi seseorang saat realitas.
Augmentation adalah konvensional secara real-time dan dalam konteks semantik
dengan unsur-unsur lingkungan. Dengan bantuan teknologi AR canggih (misalnya,
menambahkan visi komputer dan pengenalan obyek) informasi tentang dunia nyata
sekitar pengguna menjadi interaktif dan dapat dimanipulasi secara digital.
Informasi buatan tentang lingkungan dan benda-benda yang dapat dilakukan
overlay pada dunia nyata.
Dalam bab ini kita akan membuat aplikasi AR untuk perangkat iPhone / iPad.
Mulai dari awal, kita akan membuat sebuah aplikasi yang menggunakan spidol
untuk menggambar beberapa objek buatan pada gambar yang diperoleh dari
kamera. Anda akan belajar bagaimana untuk membuat sebuah proyek di Xcode IDE
dan mengkonfigurasinya untuk menggunakan OpenCV dalam aplikasi Anda. Juga,
aspek seperti menangkap video dari built-in kamera, adegan 3D rendering
menggunakan OpenGL ES, dan bangunan arsitektur aplikasi AR umum akan
dijelaskan.
Sebelum kita mulai, izinkan saya memberi Anda daftar singkat dari pengetahuan dan perangkat lunak
yang Anda akan perlu:
• Anda akan membutuhkan komputer Apple dengan Xcode IDE diinstal. Perkembangan dari
aplikasi untuk iPhone / iPad hanya mungkin dengan Apple Xcode IDE. Ini adalah satu-satunya
cara untuk membangun aplikasi untuk platform ini.
• Anda akan membutuhkan model perangkat sentuh iPhone, iPad, atau iPod. Untuk menjalankan
Anda aplikasi pada perangkat, Anda akan harus membeli Apple Developer
Sertifikat untuk USD 99 per tahun. Tidak mungkin untuk
menjalankan aplikasi yang dikembangkan pada perangkat
tanpa sertifikat ini.
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
• Anda juga akan membutuhkan pengetahuan dasar tentang Xcode IDE. Kami akan
menganggap pembaca memiliki beberapa pengalaman menggunakan IDE ini.
• pengetahuan dasar tentang Objective-C dan C ++ bahasa pemrograman juga
diperlukan.
Namun, semua bagian kompleks dari kode sumber aplikasi akan dijelaskan secara rinci.
Dari bab ini Anda akan belajar lebih banyak tentang spidol. Rutinitas Deteksi
penuh dijelaskan. Setelah membaca bab ini Anda akan dapat menulis algoritma
deteksi penanda Anda sendiri, memperkirakan penanda berpose di dunia 3D
berkaitan dengan kamera berpose, dan menggunakan transformasi ini di antara
mereka untuk memvisualisasikan objek 3D sewenang-wenang.
Anda akan menemukan proyek contoh media buku ini untuk bab ini. Ini
adalah titik awal yang baik untuk membuat aplikasi Reality Anda mobile
pertama Augmented.
Dalam bab ini, kita akan membahas topik-topik berikut:
• Membuat proyek iOS yang menggunakan OpenCV
• arsitektur aplikasi
• deteksi penanda
• identifikasi penanda
• Pengakuan kode penanda
• Menempatkan penanda dalam 3D
• Rendering objek virtual 3D
[ 48 ]
www.it-ebooks.info
Bab 2
Kami akan mulai dengan terlebih dahulu menciptakan sebuah proyek Xcode
baru dengan memilih template iOS Tunggal View Application, seperti yang
ditunjukkan pada gambar berikut:
Sekarang kita harus menambahkan OpenCV untuk proyek kami. Langkah ini
diperlukan karena dalam aplikasi ini kita akan menggunakan banyak fungsi dari
perpustakaan ini untuk mendeteksi penanda dan memperkirakan posisi posisi.
OpenCV adalah library dari fungsi pemrograman untuk real-time visi komputer.
Ini pada awalnya dikembangkan oleh Intel dan kini didukung oleh Willow Garage
dan Itseez. Perpustakaan ini ditulis dalam C dan C ++ bahasa. Ia juga memiliki
Python resmi mengikat dan binding tidak resmi dengan bahasa Java dan .NET.
[ 49 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
Tentu saja, Anda dapat membangun perpustakaan Anda sendiri dari awal.
dokumentasi OpenCV menjelaskan proses ini secara rinci. Untuk mempermudah,
kita mengikuti cara yang disarankan dan menggunakan kerangka kerja untuk bab
ini.
Setelah men-download file kita ekstrak isinya ke folder proyek, seperti yang
ditunjukkan pada gambar berikut:
[ 50 ]
www.it-ebooks.info
Bab 2
Dari sini kita bisa memilih dari daftar kerangka standar. Tapi untuk menambah
kerangka kustom kita harus klik pada tombol Add lainnya. Kotak dialog file
yang terbuka akan muncul. Arahkan ke opencv2.framework dalam folder
proyek seperti yang ditunjukkan pada gambar berikut:
#import <Availability.h>
#ifndef __IPHONE_5_0
[ 51 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
#ifdef __cplusplus
#include <opencv2 / opencv.hpp>
#berakhir jika
#ifdef __OBJC__
#import <UIKit / UIKit.h>
#import <Foundation / Foundation.h>
#berakhir jika
Sekarang Anda dapat memanggil fungsi OpenCV dari tempat manapun dalam proyek
Anda.
Itu saja. Template proyek kami dikonfigurasi dan kami siap untuk bergerak
lebih lanjut. saran gratis: membuat salinan dari proyek ini; ini akan
menghemat waktu saat Anda sedang menciptakan satu berikutnya!
arsitektur aplikasi
Setiap aplikasi iOS berisi setidaknya satu contoh dari
UIViewControllerantarmuka yang menangani semua lihat acara dan mengelola
logika bisnis aplikasi. Kelas ini menyediakan model pandangan-manajemen yang
mendasar untuk semua aplikasi iOS. Sebuah controller pandangan mengelola satu
set pandangan yang membentuk sebagian dari antarmuka pengguna aplikasi
Anda. Sebagai bagian dari pengendali lapisan aplikasi Anda, pandangan
controller mengkoordinasikan upaya-upaya dengan model yang objek dan benda-
termasuk kontroler lainnya pengendali tampilan-jadi lain aplikasi menyajikan
antarmuka pengguna tunggal yang koheren.
Aplikasi yang kita akan menulis akan memiliki hanya satu tampilan; itu sebabnya
kami memilih template Single-View Aplikasi untuk membuat satu. Pandangan ini
akan digunakan untuk menyajikan gambar yang diberikan. Kami ViewController
kelas akan berisi tiga komponen utama yang setiap aplikasi AR harus memiliki (lihat
diagram berikutnya):
• sumber video
• pipa pengolahan
• mesin visualisasi
[ 52 ]
www.it-ebooks.info
Bab 2
Sumber video bertanggung jawab untuk menyediakan frame baru yang diambil
dari kamera built-in untuk kode pengguna. Ini berarti bahwa sumber video
harus mampu memilih perangkat kamera (kamera depan atau belakang
menghadap), menyesuaikan parameter (seperti resolusi video yang diambil,
white balance, dan kecepatan rana), dan meraih frame tanpa pembekuan UI
utama.
Pengolahan citra rutin akan dirumuskan dalam MarkerDetectorkelas. Kelas ini
menyediakan antarmuka yang sangat tipis untuk kode pengguna. Biasanya itu
satu set fungsi sepertiprocessFrame dan getResult. Sebenarnya itu semua
yangViewControllerharus tahu tentang. Kita tidak harus mengekspos struktur
data tingkat rendah dan algoritma untuk lapisan tampilan tanpa keharusan yang
kuat.VisualizationController berisi semua logika yang bersangkutan dengan
visualisasi dari Augmented Reality pada pandangan kita.
VisualizationController juga fasad yang menyembunyikan tertentu
pelaksanaan mesin rendering. Rendah koherensi kode memberi kita kebebasan
untuk mengubah komponen ini tanpa perlu menulis ulang sisa kode Anda.
Pendekatan seperti ini memberi Anda kebebasan untuk menggunakan modul
independen pada platform lain dan kompiler juga. Sebagai contoh, Anda dapat
menggunakanMarkerDetectorkelas mudah untuk mengembangkan aplikasi
desktop pada sistem Mac, Windows, dan Linux tanpa perubahan kode.
Demikian juga, Anda dapat memutuskan untuk
pelabuhanVisualizationController pada platform Windows dan
menggunakan Direct3D untuk rendering. Dalam hal ini Anda harus menulis
hanya baruVisualizationControllerpelaksanaan; bagian kode lain akan tetap
sama.
[ 53 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
Rutin pengolahan utama dimulai dari menerima bingkai baru dari sumber video.
Hal ini memicu sumber video untuk menginformasikan kode pengguna tentang acara ini
dengan callback.
ViewController menangani callback ini dan melakukan operasi berikut:
Mari kita memeriksa rutin ini secara rinci. Render adegan AR termasuk gambar
gambar latar belakang yang memiliki kandungan frame terakhir yang diterima;
objek 3D buatan diambil nanti. Ketika kita mengirim frame baru untuk visualisasi,
kita menyalin gambar data ke buffer internal mesin rendering. Ini bukan render
yang sebenarnya belum; kita hanya memperbarui teks dengan bitmap baru.
Langkah kedua adalah pengolahan bingkai baru dan deteksi penanda. Kami melewati
citra kami sebagai masukan dan sebagai hasilnya menerima daftar penanda terdeteksi.
di atasnya. tanda tersebut dilewatkan ke controller visualisasi, yang tahu bagaimana
untuk menangani mereka. Mari kita lihat diagram urutan berikut di mana rutinitas ini
ditunjukkan:
[ 54 ]
www.it-ebooks.info
Bab 2
Kami memulai pembangunan dengan menulis komponen video capture. Kelas ini
akan bertanggung jawab untuk semua bingkai meraih dan untuk mengirimkan
pemberitahuan frame ditangkap melalui pengguna callback. Kemudian kita akan
menulis algoritma deteksi penanda. rutin deteksi ini adalah inti dari aplikasi Anda.
Dalam hal ini bagian dari program kami kami akan menggunakan banyak fungsi
OpenCV untuk memproses gambar, mendeteksi kontur pada mereka, menemukan
persegi panjang penanda, dan memperkirakan posisi mereka. Setelah itu kita akan
berkonsentrasi pada visualisasi dari hasil kami menggunakan Augmented Reality.
Setelah membawa semua hal-hal ini bersama-sama kita akan menyelesaikan
aplikasi AR pertama kami. Jadi mari kita lanjutkan!
Mengakses kamera
Aplikasi Augmented Reality adalah mustahil untuk membuat tanpa dua hal utama:
menangkap video dan AR visualisasi. Tahap video capture terdiri dari menerima
frame dari kamera perangkat, melakukan konversi warna yang diperlukan, dan
mengirimkannya ke pipa pengolahan. Sebagai kerangka waktu pemrosesan tunggal
sangat penting untuk aplikasi AR, proses penangkapan harus seefisien mungkin.
Cara terbaik untuk mencapai performa maksimal adalah untuk memiliki akses
langsung ke frame yang diterima dari kamera. Hal ini menjadi mungkin mulai dari
iOS Versi 4. ada API dari kerangka AVFoundation menyediakan fungsionalitas yang
diperlukan untuk membaca langsung dari buffer gambar dalam memori.
Anda dapat menemukan banyak contoh yang menggunakan
AVCaptureVideoPreviewLayer kelas dan UIGetScreenImageberfungsi untuk
menangkap video dari kamera. Teknik ini digunakan untuk iOS Versi 3 dan
sebelumnya. Sekarang telah menjadi usang dan memiliki dua kelemahan utama:
• Kurangnya akses langsung ke frame data. Untuk mendapatkan bitmap, Anda harus membuat
perantara contoh UIImage, Menyalin gambar untuk itu, dan mendapatkannya kembali. Untuk aplikasi
AR harga ini terlalu tinggi, karena setiap hal milidetik. Kehilangan beberapa frame per detik (FPS)
secara signifikan mengurangi pengalaman pengguna secara keseluruhan.
• Untuk menggambar AR, Anda harus menambahkan pandangan overlay transparan yang akan
hadir AR. Mengacu pada pedoman Apple, Anda harus menghindari lapisan non-opak karena
pencampuran mereka sulit untuk prosesor mobile.
kelas-kelas AVCaptureDevice dan AVCaptureVideoDataOutputmemungkinkan
Anda untuk mengkonfigurasi, menangkap, dan menentukan frame video
diproses di 32 Format bpp BGRA. Anda juga dapat mengatur resolusi yang
diinginkan dari frame output. Namun, hal itu mempengaruhi kinerja
keseluruhan sejak lebih besar frame waktu pemrosesan lebih dan memori
diperlukan.
[ 55 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
Ada alternatif yang baik untuk kinerja tinggi video capture. The AVFoundation
API menawarkan cara yang lebih cepat dan lebih elegan untuk ambil frame
langsung dari kamera. Tapi pertama-tama, mari kita lihat gambar berikut di mana
proses penangkapan untuk iOS ditunjukkan:
[ 56 ]
www.it-ebooks.info
Bab 2
@akhir
@akhir
Dalam callback ini kita mengunci buffer gambar untuk mencegah modifikasi oleh
setiap frame baru, mendapatkan pointer ke data gambar dan bingkai dimensi.
Kemudian kita membangun objek BGRAVideoFrame sementara yang diteruskan
ke luar melalui delegasi khusus. delegasi ini memiliki berikut prototipe:
@protocol VideoSourceDelegate <NSObject>
- (void) frameReady: (BGRAVideoFrame) bingkai;
@akhir
[ 57 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
Mari kita menjelaskan beberapa langkah ini secara lebih rinci. Setelah membuat
sesi capture, kita dapat menentukan ditetapkan kualitas yang diinginkan untuk
memastikan bahwa kita akan mendapatkan kinerja yang optimal. Kita tidak perlu
untuk memproses video berkualitas HD, jadi 640 x 480 atau resolusi bingkai
bahkan lebih rendah adalah pilihan yang baik:
- (Id) init
{
if ((self = [Super init]))
{
AVCaptureSession * capSession = [[AVCaptureSession alloc] init];
if ([capSession canSetSessionPreset:
AVCaptureSessionPreset64 0x480])
{
[CapSession setSessionPreset: AVCaptureSessionPreset640x480];
NSLog (@ "Set sesi capture yang telah ditetapkan
AVCaptureSessionPreset640x480" );
}
lain jika ([capSession canSetSessionPreset: AVCaptureSessionPresetL
ow])
{
[CapSession setSessionPreset: AVCaptureSessionPresetLow]; NSLog (@
"Set sesi capture diatur AVCaptureSessionPresetLow");
}
self.captureSession = capSession;
}
kembali diri;
}
[ 58 ]
www.it-ebooks.info
Bab 2
if (! videoDevice)
kembali FALSE;
{
NSError * kesalahan;
if (error!)
{
if ([[self captureSession] canAddInput: videoIn])
{
[[Self captureSession] addInput: videoIn];
}
lain
{
NSLog (@ "Tidak dapat menambahkan input video");
kembali FALSE;
}
}
lain
{
NSLog (@ "Tidak dapat membuat input video");
kembali FALSE;
}
[ 59 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
[Self addRawViewOutput];
[CaptureSession startRunning];
mengembalikan TRUE;
}
Harap perhatikan kode penanganan error. Jaga nilai kembali untuk hal penting seperti
bekerja dengan pemasangan perangkat keras adalah praktik yang baik. Tanpa ini, kode
Anda dapat crash dalam kasus-kasus yang tak terduga tanpa memberitahu pengguna
apa yang telah terjadi.
Kami menciptakan sesi menangkap dan menambahkan sumber frame video.
Sekarang saatnya untuk menambahkan penerima-objek yang akan menerima data
bingkai yang sebenarnya. ItuAVCaptureVideoDataOutput kelas digunakan untuk
memproses frame terkompresi dari aliran video. Kamera ini dapat memberikan
frame di BGRA, CMYK, atau model warna grayscale sederhana. Untuk tujuan kita
model warna BGRA cocok terbaik dari semua, karena kita akan menggunakan
frame ini untuk visualisasi dan pengolahan gambar. Kode berikut
menunjukkanaddRawViewOutput fungsi:
- (Void) addRawViewOutput
{
/ * Kami setupt output * /
AVCaptureVideoDataOutput * captureOutput =
[[AVCaptureVideoDataOutput alloc] init];
[ 60 ]
www.it-ebooks.info
Bab 2
numberWithUnsignedInt: kCVPixelFormatType_32BGRA];
NSDictionary * videoSettings =
[NSDictionary dictionaryWithObject: nilai
forKey: key];
[CaptureOutput setVideoSettings: videoSettings];
// Register output
[Self.captureSession addOutput: captureOutput];
}
Sekarang sesi capture akhirnya dikonfigurasi. Ketika mulai, itu akan menangkap frame
dari kamera dan mengirimkannya ke kode pengguna. Ketika frame baru tersedia,
sebuahAVCaptureSession objek melakukan captureOutput:
didOutputSampleBuffer: fromConnection callback. Dalam fungsi ini, kita akan
melakukan konversi data minor operasi untuk mendapatkan data gambar dalam format
yang lebih bermanfaat dan menyebarkannya ke kode pengguna:
[ 61 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
deteksi penanda
Sebuah penanda biasanya dirancang sebagai gambar persegi panjang memegang
area hitam dan putih di dalamnya. Karena keterbatasan diketahui, prosedur deteksi
penanda adalah sederhana. Pertama-tama kita perlu mencari kontur tertutup pada
gambar input dan unwarp gambar di dalamnya untuk persegi panjang dan
kemudian memeriksa ini terhadap model yang penanda kami.
Dalam contoh ini 5 x 5 penanda akan digunakan. Berikut adalah apa yang tampak seperti:
[ 62 ]
www.it-ebooks.info
Bab 2
Dalam proyek sampel yang Anda akan menemukan dalam buku ini, rutin
deteksi penanda dirumuskan dalam MarkerDetector kelas:
/ **
* Sebuah kelas tingkat atas yang merangkum algoritma detektor penanda
* /
kelas MarkerDetector
{
publik:
/ **
* Menginisialisasi contoh baru dari objek penanda detektor
* @calibration [di] - kalibrasi Kamera diperlukan untuk estimasi berpose.
* /
MarkerDetector (CameraCalibration kalibrasi);
terlindung:
findMarkers bool (const BGRAVideoFrame & bingkai,
std :: vector <Marker> & detectedMarkers);
pribadi:
};
[ 63 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
identifikasi penanda
Berikut adalah alur kerja rutin deteksi marker:
konversi grayscale
Konversi ke grayscale diperlukan karena spidol biasanya hanya berisi blok
hitam dan putih dan itu jauh lebih mudah untuk beroperasi dengan mereka
gambar grayscale. Untungnya, OpenCV konversi warna cukup sederhana.
Silakan lihat di kode berikut listing di C ++:
membatalkan MarkerDetector :: prepareImage (const cv ::
Mat & bgraMat, cv :: Mat & grayscale)
{
// Konversi ke grayscale
cv :: cvtColor (bgraMat, grayscale, CV_BGRA2GRAY);
}
[ 64 ]
www.it-ebooks.info
Bab 2
gambar binarization
Operasi binarization akan mengubah setiap piksel dari gambar kita menjadi hitam
(nol intensitas) atau putih (intensitas penuh). Langkah ini diperlukan untuk
menemukan kontur. Ada beberapa metode threshold; masing-masing memiliki sisi
kuat dan lemah. Cara termudah dan tercepat adalah ambang mutlak. Dalam
metode ini nilai yang dihasilkan tergantung pada intensitas pixel saat ini dan
beberapa nilai ambang batas. Jika intensitas pixel lebih besar dari nilai ambang
batas, hasilnya akan menjadi putih (255); jika tidak maka akan menjadi hitam (0).
Metode ini memiliki besar kelemahan-itu tergantung pada kondisi pencahayaan
dan perubahan intensitas ringan. Metode yang lebih disukai adalah ambang
adaptif. Perbedaan utama dari metode ini adalah penggunaan semua piksel dalam
mengingat radius sekitar pixel diperiksa. Menggunakan intensitas rata-rata
memberikan hasil yang baik dan mengamankan deteksi sudut yang lebih kuat.
Potongan kode berikut menunjukkan MarkerDetector fungsi:
membatalkan MarkerDetector :: performThreshold (const cv :: Mat & grayscale,
cv :: Mat & thresholdImg)
{
cv :: adaptiveThreshold
(grayscale, // image Masukan
thresholdImg, // Hasil citra biner
255, //
cv :: ADAPTIVE_THRESH_GAUSSIAN_C,
//
cv :: THRESH_BINARY_INV, //
7, //
7 //
);
}
[ 65 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
Setiap penanda biasanya terlihat seperti sosok persegi dengan daerah hitam dan
putih di dalamnya. Jadi cara terbaik untuk menemukan penanda adalah untuk
menemukan kontur tertutup dan perkiraan mereka dengan poligon dari 4 simpul.
deteksi kontur
Itu cv :: findCountours Fungsi akan mendeteksi kontur pada input citra biner:
kekosongan MarkerDetector :: findContours (const cv :: Mat & thresholdImg,
std :: vector <std :: vector <cv ::
Point>
> & Kontur,
int minContourPointsAllowed)
{
std :: vector <std :: vector <cv :: Point>> allContours; cv ::
findContours (thresholdImg, allContours, CV_RETR_LIST, CV_
CHAIN_APPROX_NONE);
contours.clear ();
untuk (size_t i = 0; i <allContours.size (); i ++)
{
int contourSize = allContours [i] .size ();
jika (contourSize> minContourPointsAllowed)
{
contours.push_back (allContours [i]);
}
}
}
Nilai kembali dari fungsi ini adalah daftar poligon di mana masing-masing poligon
merupakan kontur tunggal. Fungsi melompat kontur yang memiliki perimeter mereka
nilai piksel diatur menjadi kurang dari nilaiminContourPointsAllowedvariabel. Hal
ini karena kita tidak tertarik pada kontur kecil. (Mereka mungkin akan tidak
mengandung penanda, atau kontur tidak akan dapat dideteksi karena ukuran
penanda kecil.)
[ 66 ]
www.it-ebooks.info
Bab 2
calon mencari
Setelah menemukan kontur, tahap poligon pendekatan dilakukan. Hal ini
dilakukan untuk mengurangi jumlah poin yang menggambarkan bentuk kontur.
Ini adalah kualitas cek baik untuk menyaring daerah tanpa penanda karena
mereka selalu bisa diwakili dengan poligon yang berisi empat simpul. Jika poligon
didekati memiliki lebih dari atau kurang dari 4 simpul, itu jelas bukan apa yang
kita cari. Kode berikut mengimplementasikan ide ini:
kekosongan MarkerDetector :: findCandidates
(
const ContoursVector & kontur,
std :: vector <Marker> & detectedMarkers
)
{
std :: vector <cv :: Point> approxCurve;
std :: vector <Marker> possibleMarkers;
[ 67 ]
www.it-ebooks.info
Augmented Reality penanda berbasis pada iPhone atau iPad
[ 68 ]
www.it-ebooks.info