Cara mengatasi frame video di simulink

Saya sedang mengerjakan video di simulink. Seperti yang kita ketahui bahwa blok file multimedia membaca satu frame pada satu waktu jadi ketika saya akan melampirkannya dengan blok fungsi matlab, blok itu harus membaca satu frame pada satu waktu dengan perintah imread. Jika saya klik dua kali blok fungsi matlab (seperti yang ditunjukkan di http://tinypic.com/view.php?pic=dggujd&s=6) maka Anda akan melihat bahwa saya harus memberi nama fungsi seperti yang tertulis di matlab mfile beserta inputnya; yang dalam hal ini adalah video (bernama convid.avi). Saya membaca satu frame pada satu waktu tetapi saya telah memberikan seluruh video sebagai argumen untuk fungsi matlab. Ini masalahnya bagaimana saya bisa menyelesaikannya. Apa yang harus diberikan sebagai argumen di blok fungsi matlab daripada keseluruhan video. Saya juga telah mengunggah model saya di http://tinypic.com/view.php?pic=55jggw&s=6. Kode yang saya gunakan untuk vidfunc adalah:

function h=vidfunc(u)
a=imread(u); % read frame
BW = edge(a,'sobel'); %sobel edge detection
[H,thetaa,rhoo]=hough(BW); % Hough Transform
P = houghpeaks(H,6,'threshold',ceil(0.5*max(H(:))));
lines=houghlines(BW,thetaa,rhoo,P,'FillGap',15,'Minlength',15)
figure,imshow(I),hold on
for k = 1:length(lines) % Draw lines
 xy = [lines(k).point1; lines(k).point2];
 z(k)=lines(k).point2(2);
 plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');
 end
 h=z(k)

person Shayan Ali    schedule 28.09.2012    source sumber


Jawaban (1)


Sepertinya inti pekerjaan yang dilakukan dalam model "Simulink" ini sebenarnya dilakukan oleh fungsi MATLAB Anda. Jadi jawaban atas pertanyaan ini sebagian besar akan bergantung pada apa yang sebenarnya dilakukan fungsi tersebut. Secara khusus, apa masukan yang diharapkan ke vidfunc, dan apa keluaran fungsi ini? Saya menduga fungsi ini mungkin perlu direvisi agar sesuai dengan model Anda.

Untuk men-debug model Anda, ada gunanya memikirkan keluaran sinyal dari setiap blok. Pada setiap langkah waktu, blok From Multimedia File Anda akan menghasilkan satu bingkai gambar, yang menurut doc tampaknya terstruktur sebagai

Sinyal video berwarna M-by-N-by-P ​​dimana P adalah jumlah bidang warna.

Bergerak ke hilir, selanjutnya kita sampai pada blok Color Space Conversion, yang dalam hal ini sepertinya kemungkinan besar akan menghasilkan bingkai gambar dalam bentuk matriks M-kali-N (di mana setiap elemen matriks sesuai dengan intensitas gambar pada saat itu. piksel).

Sekarang kita sampai pada bagian yang menarik -- blok MATLAB Fcn. Seperti yang baru saja kita lihat, masukan ke blok ini akan berupa matriks M-kali-N yang mewakili satu bingkai gambar. Saat Anda melihat kotak dialog parameter untuk blok MATLAB Fcn, masukan ke blok ini diwakili oleh variabel u. Oleh karena itu, untuk menjalankan fungsi vidfunc pada bingkai gambar yang dimasukkan ke blok ini, Anda cukup memasukkan vidfunc(u) untuk fungsi MATLAB Anda.

Sekarang, berdasarkan masukan yang masuk ke blok MATLAB Fcn, dan fakta bahwa Anda memiliki blok Penampil Video yang terhubung ke keluaran, vidfunc harus disusun sedemikian rupa sehingga beroperasi pada satu bingkai gambar sebagai masukannya dan mengeluarkan bingkai gambar tunggal lainnya. Jika vidfunc tidak terstruktur dengan cara ini, Anda perlu mengeditnya (atau menerapkan kembali fungsi yang sama menggunakan blok Simulink).

Oleh karena itu, mari kita asumsikan bahwa vidfunc juga mengembalikan matriks M-kali-N yang mewakili bingkai gambar yang diproses. Anda dapat menyetel parameter Dimensi Keluaran untuk blok MATLAB Fcn Anda ke -1 untuk menunjukkan bahwa keluaran akan memiliki dimensi yang sama dengan masukan. Selain itu, (seperti yang ditunjukkan dalam doc) Anda perlu memastikan Ciutkan hasil 2-D ke 1-D tidak dicentang atau keluaran gambar Anda akan berbentuk satu vektor panjang dan bukan matriks M-kali-N.

Asalkan vidfunc disusun dengan benar, ini akan menyelesaikan masalah Anda.

CATATAN: Untuk membuat hidup Anda lebih mudah, saya sangat menyarankan untuk menampilkan tipe dan dimensi data sinyal dalam model Simulink Anda. Hal ini dapat membantu menghindari banyak kebingungan. dokumen ini menjelaskan dengan tepat cara melakukan ini.

--UPDATE--

Setelah melihat kode Anda, ini menegaskan kecurigaan saya bahwa input/output vidfunc tidak konsisten dengan apa yang diharapkan model Simulink Anda. Cara Anda melanjutkan sangat bergantung pada batasan desain Anda dan apa yang sebenarnya Anda inginkan dari sistem ini. Pada dasarnya, model Simulink dan fungsi MATLAB Anda tidak setuju... mana yang benar? Saya akan memberikan beberapa pemikiran umum berdasarkan tebakan terbaik saya tentang tujuan Anda.

Pertama, Simulink meneruskan gambar (dalam bentuk matriks M-kali-N) ke vidfunc. Artinya vidfunc tidak perlu lagi memuat gambar di awal kode. Jadi saya yakin Anda dapat memperbarui beberapa baris kode pertama menjadi seperti ini:

function h=vidfunc(a)
BW = edge(a,'sobel'); %sobel edge detection

Lihat bahwa sekarang vidfunc mengambil gambar sebenarnya (bukan nama file yang berisi gambar tersebut) sebagai masukannya. Pada dasarnya, Anda menghapus baris a=imread(u); dan langsung memproses a.

Masalah lainnya adalah keluaran vidfunc. Simulink mengharapkan keluaran berupa gambar, namun ternyata tidak. Saya tidak 100% yakin apa yang h seharusnya ada dalam kode ini (ketika saya pertama kali melihat kode Anda, saya pikir ini adalah pegangan untuk objek garis tetapi sepertinya tidak demikian). Tampaknya ini adalah koordinat y dari titik akhir salah satu garis besar. Namun demikian, bukan itu yang diharapkan oleh model Simulink Anda. Yang ini tidak mudah untuk diperbaiki. Mungkin Anda bisa mencoba menggunakan getframe untuk mengambil gambar dari plot garismu.

Saya sebenarnya merasa bahwa saran terbaik yang bisa saya berikan kepada Anda adalah membuang fungsi MATLAB dan mengimplementasikan semuanya di Simulink. Saya pikir ini akan jauh lebih mudah daripada mencoba membuat vidfunc berfungsi baik dengan model Anda. vidfunc sebenarnya tidak berisi kode sebanyak itu, jadi ini bukanlah tugas yang terlalu sulit bagi Anda. Manfaat lainnya adalah di akhir proses ini Anda akan memiliki model Simulink bagus yang secara eksplisit menunjukkan semua langkah pemrosesan gambar yang Anda ambil.

Saya percaya bahwa semua pemrosesan gambar yang Anda lakukan dengan fungsi MATLAB juga dapat dilakukan dengan blok Simulink (lihat bagian Blok Simulink di doc).

Semoga beruntung.

person grungetta    schedule 29.09.2012
comment
Pak jika saya menulis 'u' sebagai argumen input ke vidfunc saya masih mendapatkan kesalahan 'String input harus memiliki satu baris'. vidfunc hanya mengambil satu frame pada satu waktu; kemudian mengekstraksi wilayah yang diinginkan dan kemudian saya menerapkan deteksi tepi sobel dan terakhir Hough Transform digunakan. Sebenarnya masalahnya adalah blok fungsi matlab memerlukan argumen dalam parameter nama file misalnya jika gambar saya berikan sebagai myfunction('a.jpg'). Sekarang saya tidak dapat menulisnya sebagai myfunction('video.avi') karena memakan waktu sebuah bingkai, bukan seluruh video sekaligus. Bagaimana cara menulis ini? Apakah ini masalahnya atau ada hal lain. - person Shayan Ali; 29.09.2012
comment
Jika bisa, perbarui postingan asli Anda untuk menyertakan kode MATLAB Anda. Dari uraian Anda, sepertinya dari situlah masalah Anda berasal. Anda mengatakan bahwa hal pertama yang dilakukan vidfunc adalah memuat gambar satu per satu dari video Anda. Namun, vidfunc tidak perlu lagi melakukan langkah pemuatan file ini karena Anda memuat video di Simulink dan meneruskan satu bingkai gambar langsung ke fungsinya. Jadi, seperti yang dibahas dalam posting saya, Anda harus menghapus bagian vidfunc yang berhubungan dengan memuat file video dan mengulangi melalui bingkai. Simpan saja bagian yang memproses bingkai. - person grungetta; 29.09.2012
comment
Pak, saya telah memperbarui postingan saya dengan menyertakan kodenya. Tolong bimbing saya di mana saya melakukan kesalahan. - person Shayan Ali; 29.09.2012
comment
@ShayanAli - Melihat sekilas kode Anda, saya melihat dua masalah. 1) vidfunc mengambil nama file gambar sebagai masukan, dan 2) mengembalikan array pegangan ke objek garis. Berdasarkan struktur model Simulink Anda, vidfunc perlu ditulis ulang untuk mengambil gambar sebenarnya sebagai masukannya (dalam kasus Anda ini adalah variabel a). Selain itu, ia perlu mengeluarkan gambar. Jadi ini membuat saya bertanya-tanya, jika pada dasarnya semua pekerjaan dilakukan oleh fungsi Anda, mengapa Anda mencoba menggunakan ini di Simulink? Apa hasil yang Anda inginkan dari keseluruhan proses ini? Hal ini akan sangat mempengaruhi cara melanjutkannya - person grungetta; 30.09.2012
comment
Saya melewatkan beberapa blok pada model saya. Saya telah memperbarui model saya lagi di tinypic.com/view .php?pic=1zzj3o1&s=6 . Pak, saya sudah mencoba semua tip yang Anda ceritakan tetapi model saya tidak berjalan; karena masih belum memilih satu frame dan memprosesnya dalam fungsi matlab. - person Shayan Ali; 04.10.2012
comment
@ShayanAli Bisakah Anda memposting versi terbaru kode matlab Anda. Apakah Anda juga mendapatkan pesan kesalahan tertentu (posting jika demikian). Juga apa pengaturan parameter untuk blok fungsi matlab sekarang. Mungkin hal ini perlu diubah karena bentuk masukan dan keluaran Anda telah berubah. - person grungetta; 04.10.2012
comment
Pak akan lebih baik jika saya jelaskan dulu masalah saya sebenarnya file avi yang saya miliki adalah jalan & saya mencoba mendeteksi jalur jalan menggunakan transformasi meskipun. Pertama saya mencoba menerapkannya di simulink tetapi tidak berhasil;lalu Saya telah menulis fungsi matlab untuk itu & mencoba menggunakannya dalam model simulink saya. Jika saya memuat video itu di matlab dan kemudian menjalankannya, itu berfungsi dengan baik tetapi itu membuat saya kesulitan dalam simulink. Jika saya menggunakan model yang sama untuk sebuah gambar, itu berfungsi tetapi ketika saya menjalankannya untuk video saya maka itu tidak berfungsi. satu hal lagi Pak bagaimana masukan saya berubah untuk model yang diperbarui. – - person Shayan Ali; 05.10.2012
comment
Bisakah Anda memposting versi terbaru kode MATLAB Anda. Selain itu, ketika Anda mengatakan itu tidak berfungsi, apakah Anda mendapatkan pesan kesalahan (jika demikian, kirimkan) atau hanya karena keluaran Anda tidak sesuai dengan yang Anda inginkan/harapkan? - person grungetta; 05.10.2012
comment
Pak simulink memiliki blok untuk mengimplementasikan transformasi meskipun tetapi ketika saya menggunakannya, jalur jalan tidak terdeteksi meskipun saya telah membatasinya pada wilayah yang saya minati; jadi Anda dapat mengatakan bahwa itu tidak berfungsi sesuai keinginan saya. Saya telah mengunggah modelnya di tinypic.com/view.php?pic=1zb5rsw&s=6 Bisakah Anda membimbing saya bagaimana cara menerapkannya dengan benar. - person Shayan Ali; 09.10.2012
comment
Saya membayangkan Anda sudah meninjau ini, tetapi jika belum lihat ini tautan. Contoh bawaan Simulink ex_vision_detect_lines melakukan hampir persis apa yang Anda cari (dengan pengecualian blok ROI). Saya menyarankan untuk memplot keluaran Hough Lines dalam suatu cakupan untuk melihat apakah itu benar-benar menghasilkan keluaran yang Anda inginkan. Mungkin model Anda berfungsi dengan baik tetapi garisnya tidak divisualisasikan dengan baik (seperti mungkin Draw Lines menggambar garis putih pada bagian putih gambar Anda). - person grungetta; 10.10.2012
comment
Terima kasih Pak atas bimbingannya. Pak sebenarnya di blok ROI saya telah memotong jalur jalan dari video dan kemudian saya menerapkan meskipun hanya pada jalur tersebut saja sehingga harus mendeteksinya; tapi ini memberi saya hanya satu baris di area yang bahkan bukan bagian dari ROI. Bimbing saya apa yang mungkin menjadi masalahnya. Terima kasih sekali lagi. Saya akan mengikuti langkah-langkah yang Anda sebutkan di atas & akan memberi tahu Anda jika saya mengalami masalah. - person Shayan Ali; 10.10.2012
comment
Oke, salah satu masalahnya adalah Hough Lines akan menampilkan koordinat garis relatif terhadap ROI, bukan terhadap gambar asli Anda. Anda dapat mengonfirmasi hal ini dengan menggunakan keluaran Define ROI sebagai masukan gambar ke Draw Shapes dan melihat apakah garis sekarang digambar di tempat yang benar. Jika ini masalahnya, ini berarti Anda perlu menambahkan offset ke output Hough Lines untuk mengonversi dari koordinat ROI ke koordinat gambar asli. - person grungetta; 10.10.2012
comment
Untuk menemukan lebih banyak baris, Anda perlu meningkatkan parameter Maximum number of local maxima di blok Find Local Maxima Anda. Ingatlah bahwa ini mungkin mengharuskan Anda untuk mengubah blok Selector Anda juga, untuk mengakomodasi dimensi baru dari output Find Local Maxima, karena output ini sekarang akan menjadi array dua dimensi. - person grungetta; 10.10.2012
comment
Terima kasih Pak atas bimbingan dan bantuannya Anda tidak tahu seberapa banyak Anda telah membantu saya. Pak Saya telah melampirkan keluaran 'Tentukan ROI' sebagai masukan gambar ke 'Gambar Bentuk' dan sekarang garis-garisnya kira-kira pada posisinya tapi pak saya tidak tahu bagaimana cara menambahkan offset pada keluaran Hough Lines untuk mengkonversi dari koordinat ROI ke koordinat gambar asli. Bisakah Anda membimbing saya. - person Shayan Ali; 11.10.2012
comment
Lihat dokumen untuk blok Menggambar Bentuk. Sepertinya ada pengaturan yang memungkinkan Anda menentukan wilayah yang diinginkan. Setel parameter Draw shapes in blok ini ke Specify region of interest via port. Menurut dokumen, Saat Anda memilih opsi ini, port ROI muncul di blok. Masukkan vektor empat elemen dengan nilai bilangan bulat, [x y lebar tinggi], dengan [x y] adalah koordinat sudut kiri atas area tersebut. - person grungetta; 12.10.2012
comment
oke Pak sebenarnya saya memiliki matlab-2009 & fitur ini tidak tersedia di dalamnya jadi saya rasa saya harus menginstal matlab-2012 terlebih dahulu & kemudian mencobanya. Saya akan memberi tahu Anda jika saya mengalami masalah. Terima kasih - person Shayan Ali; 12.10.2012
comment
Ini seharusnya tersedia pada tahun 2009, namun Anda harus mengaktifkannya. Baca dokumen ini untuk versi MATLAB 2009a blok Draw Shapes). Seperti yang saya katakan di komentar terakhir saya, Anda harus membuka dialog parameter untuk blok tersebut, dan memilih Specify region of interest via port untuk bidang Draw shapes in. - person grungetta; 12.10.2012
comment
Secara umum, Anda akan terhindar dari kerumitan jika Anda membaca dokumentasi setiap blok dengan cermat. Dokumen online Matlab/Simulink adalah alat yang sangat berguna. - person grungetta; 12.10.2012
comment
oke Pak Terima kasih saya akan mengikutinya. Pak, jika saya akan menentukan ROI saya dalam blok bentuk gambar, apakah perlu 'mendefinisikan blok ROI' di awal. - person Shayan Ali; 12.10.2012
comment
Pemahaman saya adalah Anda perlu menggunakan keduanya. Saya percaya bahwa pengaturan wilayah yang diminati di Draw Shapes hanya memberi tahu blok itu bahwa garis yang akan Anda gambar memiliki koordinat yang berkaitan dengan wilayah yang diinginkan, bukan terhadap keseluruhan gambar. - person grungetta; 13.10.2012
comment
Pak Model terbaru saya diunggah di tinypic.com/view.php?pic=24wx15f&s=6. Saya telah mengunggah bingkai video jalan saya di tinypic.com/view.php?pic= 2wp8c9e&s=6. Parameter yang saya gunakan untuk 'Tentukan blok ROI' diunggah di tinypic.com/ lihat.php?pic=24f9vo8&s=6. Bingkai video setelah dipotong diunggah di tinypic.com/view.php?pic=2lbe59s&s= 6. Sekarang masalahnya adalah saya menggunakan parameter yang sama untuk port ROI di blok Gambar bentuk seperti yang saya gunakan untuk blok Tentukan ROI tetapi tidak menunjukkan garis yang terdeteksi dalam video. Parameter yang digunakan adalah vektor=[120 10 60 290]. - person Shayan Ali; 13.10.2012
comment
apa masalahnya, Pak. Saya bahkan mencoba mengubah nilai-nilai tersebut tetapi pada akhirnya tidak menghasilkan apa-apa. - person Shayan Ali; 13.10.2012
comment
Anda mungkin hanya mencampurkan pengurutan pada input ROI ke Draw Shapes Menurut dokumen, inputnya adalah vektor 4 elemen bilangan bulat [x y lebar tinggi], yang menentukan area persegi panjang untuk menggambar bentuk. Dua elemen pertama mewakili koordinat berbasis satu dari sudut kiri atas area tersebut. Dua elemen kedua mewakili lebar dan tinggi area. Jadi ia mencari [x y width height] dan saya pikir Anda sedang mencari [y x height width]. - person grungetta; 13.10.2012
comment
Juga, saya tidak 100% yakin, tapi menurut saya daripada membuat vektor dengan mux, Anda sebaiknya memasukkannya langsung dari blok konstanta. Jadi jangan punya 4 blok konstan dengan nilai 20, 120, 290, dan 60. Miliki satu blok konstan dengan nilai [20, 120, 290, 60]. Blok konstan tidak harus berupa skalar saja. - person grungetta; 13.10.2012
comment
Pak, menarik untuk dicatat bahwa parameter yang telah saya berikan pada blok ROI (yang berfungsi dengan baik untuk itu); tidak berfungsi ketika saya memberikannya sebagai masukan untuk menggambar blok bentuk. Saya mendeteksi garis putih di area yang bukan merupakan minat saya. Saya telah mengunggah bingkai dengan garis putih terdeteksi di tinypic.com/view.php?pic= 2vmizhd&s=6. Saya harap garis putih itu terlihat oleh Anda. - person Shayan Ali; 13.10.2012
comment
apa masalahnya. Saya juga mencoba dengan memvariasikan parameter. Sekali lagi terima kasih atas waktu, bimbingan & bantuannya. Sungguh, aku tidak punya kata-kata untuk berterima kasih... - person Shayan Ali; 13.10.2012
comment
Pada titik ini saya pikir tebakan Anda sama bagusnya dengan tebakan saya. Anda mungkin berada di tempat yang lebih baik daripada saya untuk dapat menjawab pertanyaan-pertanyaan seperti ini. Anda hanya perlu melalui beberapa proses debug kuno yang bagus. Saya menyarankan untuk menggunakan banyak cakupan dan Blok tampilan untuk cari tahu dengan tepat apa yang terjadi pada setiap tahap model Anda. Anda mungkin perlu bereksperimen sedikit dengan blok Draw Shapes tersebut untuk mempelajari cara kerjanya. Mungkin membuat model baru, memasukkan beberapa masukan yang diketahui ke Draw Shapes dan melihat bagaimana perilakunya. - person grungetta; 14.10.2012
comment
Pak simulink memberikan poin yang dievaluasi melalui transformasi meskipun sebagai ‹4x1x251 int32›. val(:,:,1) = 46 0 54 290 val(:,:,2) = 46 0 54 290 ...................... I saya tidak tahu bagaimana menganalisisnya; informasi apa yang diberikannya kepada saya. Pertama-tama saya menganalisis transformasi hough di matlab mfile; di sana saya mendapatkan struktur garis yang sesuai dengan setiap jalur yang terdeteksi yang dapat dengan mudah dianalisis. - person Shayan Ali; 18.10.2012